gpt4 book ai didi

python - 在 any() 语句中迭代一个小列表是否更快?

转载 作者:太空狗 更新时间:2023-10-30 01:27:37 25 4
gpt4 key购买 nike

在低长度可迭代对象的限制中考虑以下操作,

d = (3, slice(None, None, None), slice(None, None, None))

In [215]: %timeit any([type(i) == slice for i in d])
1000000 loops, best of 3: 695 ns per loop

In [214]: %timeit any(type(i) == slice for i in d)
1000000 loops, best of 3: 929 ns per loop

设置为 list 比使用生成器表达式快 25%?

为什么会这样,因为设置为 list 是一个额外的操作。

注意:在两次运行中我都收到了警告:最慢的运行时间比最快的运行时间长 6.42 倍。这可能意味着正在缓存中间结果 I

分析

在这个特定的测试中,list() 结构在长度为 4 时速度更快,生成器的性能也因此提高。

红线表示此事件发生的位置,黑线表示两者性能相同的位置。

enter image description here利用所有内核,代码在我的 MacBook Pro 上运行大约需要 1 分钟:

import timeit, pylab, multiprocessing
import numpy as np

manager = multiprocessing.Manager()
g = manager.list([])
l = manager.list([])

rng = range(1,16) # list lengths
max_series = [3,slice(None, None, None)]*rng[-1] # alternate array types
series = [max_series[:n] for n in rng]

number, reps = 1000000, 5
def func_l(d):
l.append(timeit.repeat("any([type(i) == slice for i in {}])".format(d),repeat=reps, number=number))
print "done List, len:{}".format(len(d))
def func_g(d):
g.append(timeit.repeat("any(type(i) == slice for i in {})".format(d), repeat=reps, number=number))
print "done Generator, len:{}".format(len(d))

p = multiprocessing.Pool(processes=min(16,rng[-1])) # optimize for 16 processors
p.map(func_l, series) # pool list
p.map(func_g, series) # pool gens

ratio = np.asarray(g).mean(axis=1) / np.asarray(l).mean(axis=1)
pylab.plot(rng, ratio, label='av. generator time / av. list time')
pylab.title("{} iterations, averaged over {} runs".format(number,reps))
pylab.xlabel("length of iterable")
pylab.ylabel("Time Ratio (Higher is worse)")
pylab.legend()
lt_zero = np.argmax(ratio<1.)
pylab.axhline(y=1, color='k')
pylab.axvline(x=lt_zero+1, color='r')
pylab.ion() ; pylab.show()

最佳答案

要注意的是您要对其应用 any 的项目的大小。在更大的数据集上重复相同的过程:

In [2]: d = ([3] * 1000) + [slice(None, None, None), slice(None, None, None)]*1000

In [3]: %timeit any([type(i) == slice for i in d])
1000 loops, best of 3: 736 µs per loop

In [4]: %timeit any(type(i) == slice for i in d)
1000 loops, best of 3: 285 µs per loop

然后,使用 list(将所有项目加载到内存中)变得更慢,生成器表达式的效果更好。

关于python - 在 any() 语句中迭代一个小列表是否更快?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38064206/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com