python any语句_python – 在any()语句中迭代一个小列表会更快吗?

在低长度迭代次数的限制中考虑以下操作,

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

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

为什么会这样,因为设置列表是一项额外的操作.

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

分析

在这个特定的测试中,list()结构的速度更快,长度为4,发生器的性能提高了.

红线表示此事件发生的位置,黑线表示两者在性能上相等.

ExQbg.png

通过利用所有内核,代码大约需要1分钟才能在我的MacBook Pro上运行:

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()

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值