python - Python:检查两个列表是否一起增加的任何优化方法?
问题描述
假设我们有 2 个列表a = [1,2,4,3,5]
和b = [103,122,800,500,1000]
有没有一种优化的方法可以检查它们是否“一起增加”?
我当前的解决方案采用循环:
for i in range(1,len(a)):
if (a[i-1] < a[i] and b[i-1] > b[i]) or (a[i-1] > a[i] and b[i-1] < b[i]):
print('wrong')
有没有更好的办法?
笔记:
- 解决方案不需要特定于列表(实际上任何数据结构都可以)
- 两个可迭代项不需要增加相同的单位数,只需一起增加即可。
解决方案
就 O(顺序表示法)而言,假设列表没有某种顺序,你不能比线性更好。但是,你可以使用一些 python 编译器,比如 cython、numba 来加速你的代码。您使用numba的代码:
import numpy as np
import numba as nb
@nb.njit()
def vary_together(a, b):
for i in range(1,len(a)):
if (a[i-1] < a[i] and b[i-1] > b[i]) or (a[i-1] > a[i] and b[i-1] < b[i]):
return False
return True
您必须使用大型列表才能看到性能优势。例如,如果:
a = np.array([randint(0,100) for i in range(10000000)])
然后,
vary_together(a, a) # a as both arguments so as to make it complete the loop
与您的解决方案的性能比较为:
您的解决方案:8.09s
vary_together:0.2(第二次运行以减少编译时间)。
如果您需要在脚本中一次又一次地运行代码,请cache=True
在nb.njit
装饰器中执行。
推荐阅读
- javascript - Chart.js 更新到 X 轴未更新
- angular - 关于 ng add @angular/cli 的问题
- node.js - NodeJs Restify SQLServer TypeScript - IIS - 不可能的任务?
- php - Entrust 没有看到权限
- sql - 在 Oracle SQL 中使用月份名称将 varchar 转换为日期
- python - 如何在生成器提供的 Keras 自定义损失函数中访问样本权重?
- reactjs - SetState 基于带有钩子的操纵道具
- python - 使用 python 请求构建 ProcessAuth POST
- r - Facet_Wrap 在我的数据集中因更多级别的因素而拥挤
- javascript - 如何添加和使用 Vue 模板中的数据?