繁体   English   中英

每个Python的速度比建立索引的速度快?

[英]Python for each faster than for indexed?

在python中,哪个更快?

1个

for word in listOfWords:
    doSomethingToWord(word)

2

for i in range(len(listOfWords)):
    doSomethingToWord(listOfWords[i])

当然我会在python 2.x中使用xrange。

我的假设是1.比2快。如果是,为什么呢?

使用Python的timeit模块来回答此类问题:

duncan@ubuntu:~$ python -m timeit -s "listOfWords=['hello']*1000" "for word in listOfWords: len(word)"
10000 loops, best of 3: 37.2 usec per loop
duncan@ubuntu:~$ python -m timeit -s "listOfWords=['hello']*1000" "for i in range(len(listOfWords)): len(listOfWords[i])"
10000 loops, best of 3: 52.1 usec per loop

不用问这个问题,您总是可以尝试自己做。 不难 超级简单的基准测试将为您显示差异。

from datetime import datetime
arr = [4 for _ in xrange(10**8)]

startTime = datetime.now()
for i in arr:
    i
print datetime.now() - startTime

startTime = datetime.now()
for i in xrange(len(arr)):
    arr[i]
print datetime.now() - startTime

在我的机器上是:

0:00:04.822513
0:00:05.676396

请注意,您要迭代的列表应该很大,才能看到区别。 第二个循环较长,因为每次您都需要按索引( arr[i] )查找并生成xrange的值时。

请不要在大多数无用的微优化上花费太多时间,而应尝试看看是否可以提高内部循环函数的计算复杂度。

只需尝试timeit

  In [2]:  def solve(listOfWords):
         for word in range(len(listOfWords)):
               pass
   ...:     

In [3]: %timeit solve(xrange(10**5))
100 loops, best of 3: 4.34 ms per loop

In [4]:  def solve(listOfWords):
         for word in listOfWords:
               pass
   ...:     

In [5]: %timeit solve(xrange(10**5))
1000 loops, best of 3: 1.84 ms per loop

除速度优势外,1看上去“更干净”,但也适用于不支持len的序列,即生成器表达式和生成器函数的结果。 使用的解决方案2,您必须先发电机转换到一个列表,以便如果你能得到它的长度。 但是,如果生成器生成所有质数的列表,而doSomething正在寻找第一个值> 100怎么办?

for num in prime_number_generator():
    if num > 100: return num

由于此生成器没有结束符,因此无法将其转换为第二种形式。

另外,如果创建列表的元素非常昂贵(例如从数据库或远程Web服务器中获取)怎么办? 如果要从生成的N个值集中寻找匹配值,则使用#1可以在找到匹配项后立即退出,并且平均避免生成N / 2个值。 要使用#2,首先必须生成所有N个值,以便获得长度以形成范围。

原因是Python 3将许多内置函数转换为返回迭代器而不是列表的原因-它们更加灵活。

What is Pythonic?
"for i in range(len(seq)):"? No.
Use "for x in seq:"

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM