首页 > 解决方案 > 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')

有没有更好的办法?

笔记:

标签: pythonsequence

解决方案


就 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=Truenb.njit装饰器中执行。


推荐阅读