Python的每一个都比索引更快?

时间:2014-11-14 08:40:56

标签: python for-loop

在python中哪个更快?

1

for word in listOfWords:
    doSomethingToWord(word)

2

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

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

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

4 个答案:

答案 0 :(得分:4)

使用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

答案 1 :(得分:3)

不要问这个问题,你可以自己尝试一下。这并不难。 超级简单的基准测试将向您展示差异。

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的值。

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

答案 2 :(得分:2)

只需尝试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

答案 3 :(得分:1)

除了速度优势之外,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:"