簡體   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