回答
對於速度的測量,請參閱Python標準庫模塊timeit:
$ python -m timeit -s 'f = file("/tmp/numbers.txt")' '[float(line.partition(" ")[0]) for line in f]'
10000000 loops, best of 3: 0.123 usec per loop
$ python -m timeit -s 'f = file("/tmp/numbers.txt")' '[float(line.split(" ")[0]) for line in f]'
10000000 loops, best of 3: 0.132 usec per loop
$ python -m timeit -s 'f = file("/tmp/numbers.txt")' '[float(line.split(" ", 1)[0]) for line in f]'
10000000 loops, best of 3: 0.127 usec per loop
partition
似乎比快split
,至少。我現在想不到更快的方式,做得很好。
使用'file'打開文件是什麼? – SilentGhost 2010-06-23 14:12:02
在這個問題上,沒有提到這是Python 3代碼(因爲我從另一個答案的一條評論中發現它是這樣的)。因此,Lars明確地認爲它是Python 2.x(如果文件是完全有效的,如果可能不合意的話)。 – rbp 2010-06-23 14:25:22
更聰明的是不要影響file
。
這段代碼是用py3k編寫的,沒有'file' – SilentGhost 2010-06-23 09:30:17
也許他的意思是說OP通過確定結果列表來映射他自己的「打開文件的對象」(file = [something for line in文件])。在這段代碼中可能並不相關,但它當然不可取。當然,這也不是對這個問題的回答。 – rbp 2010-06-23 13:41:07
這取決於您在列表創建後將對列表做什麼。如果您只是要遍歷它,那麼使用生成器表達式可能會更好,因此您不會一次將整個文件加載到內存中。如果文件很大,則可能導致頁面交換或內存不足錯誤。
我已經通讀了您發佈的相關問題,並且在您閱讀完數據後可以看不到您想要解決什麼問題或您要對數據執行的操作。如果您給我們更多的背景,我們可能會提供更具體和有用的答案。
如果你只在第一空間之前出現(假設總是有一個)一切有興趣,你可以嘗試使用字符串索引:
[float(line[:line.index(" ")]) for line in f]
借用拉斯的測試中,它的運行速度比分區快:
[email protected] ~$ python -m timeit -s 'f = open("/tmp/numbers.txt")' '[float(line.partition(" ")[0]) for line in f]'
10000000 loops, best of 3: 0.192 usec per loop
[email protected] ~$ python -m timeit -s 'f = open("/tmp/numbers.txt")' '[float(line[:line.index(" ")]) for line in f]'
10000000 loops, best of 3: 0.181 usec per loop
而且,當然,如果你對括號交換外方括號,你會得到一個生成器表達式,它不產生所有的結果,立竿見影。根據您將如何使用這一點,它可以融入「聰明」類別:)
編輯補充:
......雖然,因爲SilentGhost提到這是py3k,速度差是不相關然後:
[email protected] ~$ python3 -m timeit -s 'f = open("/tmp/numbers.txt")' '[float(line[:line.index(" ")]) for line in f]'
100000 loops, best of 3: 10.9 usec per loop
[email protected] ~$ python3 -m timeit -s 'f = open("/tmp/numbers.txt")' '[float(line.partition(" ")[0]) for line in f]'
100000 loops, best of 3: 11 usec per loop
但我仍然認爲指數是更好,因爲它清楚地表明你的意思(而不是分區,它給你,你馬上扔掉兩個額外的值)
他們對我來說完全一樣 – SilentGhost 2010-06-23 14:09:36
我剛剛添加了py3k測量,並提到速度差異不適用於它。也許這就是你正在經歷的? – rbp 2010-06-23 14:14:32
這與py3k無關,我用python-2.6測試過,它給了我相同的值。 – SilentGhost 2010-06-23 14:22:17
- 1. CSS - 更聰明的代碼註釋
- 2. bash腳本貓更聰明
- 3. IF ELSE IF ELSE IF ....代碼想要變得更聰明
- 4. 更聰明的git filter-branch --subdirectory-filter
- 5. Visual C++ intellisense比編譯器「更聰明」
- 6. 是否有更聰明的替代Trang從xml文件生成XSD
- 7. 聰明的替換換行符
- 8. 我怎麼能把這個PHP代碼作爲一個聰明的代碼?
- 9. 這很聰明還是不行?
- 10. mmap有多聰明?
- 11. 異常和聰明
- 12. 需要這個聰明的幫助
- 13. 你有什麼聰明的算法比下面的代碼
- 14. 聰明的方法來CSS3
- 15. 聰明的選擇選項
- 16. 清潔/更聰明的方式來使用循環
- 17. Visual Studio - 更聰明的單詞完成想要
- 18. 做了很多日期以更聰明的方式比較
- 19. Rails:爲動態值重寫as_json - 有更聰明的方法嗎?
- 20. SecTrustedApplicationCreateFromPath太聰明瞭嗎?
- 21. 貓鼬是否聰明?
- 22. 聰明點擊權限
- 23. 這是一個聰明的方式來組織代碼在jQuery中?
- 24. c#編譯器比VB.NET編譯器更聰明嗎?
- 25. 更快amfPHP替代
- 26. 替代memcpy更快?
- 27. 使用ruby gsub和正則表達式更聰明地替換字符
- 28. 更快捷/更有效的Ruby元帥替代品?
- 29. 父(),更快的替代?
- 30. 更快的替代ColorConvertOp
爲什麼你分配數組到文件對象? – miku 2010-06-23 07:08:39
@Roque:這裏沒有對文件對象的賦值,因爲在Python中根本沒有賦值。這是我的代碼,如果你去OP的歷史搜索,你會明白爲什麼它完成。 – SilentGhost 2010-06-23 09:33:35