我想比较两个列表中的每个元素(例如,a中的每个元素是否大于或等于同一索引中b中的每个元素),并且想知道是否存在比迭代更快的方式。 E.g。
import random
import time
a = [random.randint() for i in range(10**7)]
b = [random.randint() for i in range(10**7)]
我想知道是否有比这更快的方法:
start = time.time()
for i in range(10**7):
if a[i] < b[i]:
continue
else:
print('Nope')
break
end = time.time()
print('%.100f' %(end-start))
Out:
Nope
0.0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
根据以下答案的建议,这是使用numpy
所花费的时间start = time.time()
al = np.all(np.array(b) > np.array(a))
end = time.time()
print('%.100f' %(end-start))
Out:
1.6209998130798339843750000000000000000000000000000000000000000000000000000000000000000000000000000000
如何比较字典中的键?与上面相同,但我们不是比较列表的元素,而是比较字典的键。
谢谢!
答案 0 :(得分:2)
如果你想比较每个成对的元素,你将不得不进行迭代,你的当前算法已经是O(n)
,正如评论中所指出的那样。
但是,使用生成器,可以减少操作总数。具体来说,要创建两个列表,无论谓词(a[i] < b[i]
)是否会失败,都会执行2 * 10 ^ 5个操作。使用生成器,您将只根据需要创建列表元素,因此没有初始的2 * 10 ^ 5成本。
import random
a = (random.randint() for _ in range(10**5))
b = (random.randint() for _ in range(10**5))
到目前为止,我们总共只执行了2次操作。
for i in range(10**5):
if next(a) < next(b):
continue
else:
print('Nope:', i)
break
现在,我们在技术上每循环执行更多操作,但是一旦生成器耗尽(即a[i]
永远不会更大的话,总运营成本将只会达到原始运行成本(使用基本列表)大于或等于b[i]
)。
答案 1 :(得分:1)
您可以使用numpy来执行此操作。只需将列表作为数组加载,然后比较它们。 Numpy主要用C语言编写,使得这些操作比纯Python更快
import numpy as np
import random
a = np.array([random.randint(0, 10) for i in range(10**5)])
b = np.array([random.randint(0, 10) for i in range(10**5)])
a >= b
输出:
array([False, False, False, ..., True, True, True], dtype=bool)
字典更复杂,因为它们没有订购。您可以尝试制作有序字典,获取值,然后重复使用上述方法
答案 2 :(得分:1)
import numpy as np
。
al = np.all(np.array(b) > np.array(a))
输出
al will be true if each element in a > each element in b
import time
import numpy as np
lst1 = [1, 2, 3, 4, 5, 6, 6]
lst2 = [4, 5, 6, 7, 8, 9, 9]
lst3 = [3, 5, 6, 6, 7, 7, 1]
def function1(a, b):
start = time.clock()
al = np.all(np.array(b) > np.array(a))
print("%f" % (time.clock() - start))
def function2(a, b):
start = time.clock()
for i in range(7):
if a[i] < b[i]:
continue
else:
print('Nope')
break
print("%f" % (time.clock() - start))
function1(lst1, lst2) #0.000046
function2(lst1, lst2) #0.000002
function1(lst1, lst3) #0.000011
function2(lst1, lst3) #0.000005
O(n)更快。
答案 3 :(得分:1)
基本上,您需要迭代以从示例中的列表中检索需要比较的元素。
更好的方法是:
for x, y in zip(a,b):
if x < y:
continue
else:
print('Nope')
break
更快的方式是:
if a > b: print("nope")
这正是您在代码中所做的工作,将a
中的每个元素与b
中的每个元素进行比较,如果a
中的任何元素大于相应的元素b
中的元素,打印"nope"
并退出。这也是比较运算符的作用。