2010-06-23 62 views
0
file = [float(line.partition(' ')[0]) for line in file] 

該文件是打開的文件的對象......這行代碼更聰明/更快/更聰明的替代品?

thnq

+0

爲什麼你分配數組到文件對象? – miku 2010-06-23 07:08:39

+0

@Roque:這裏沒有對文件對象的賦值,因爲在Python中根本沒有賦值。這是我的代碼,如果你去OP的歷史搜索,你會明白爲什麼它完成。 – SilentGhost 2010-06-23 09:33:35

回答

1

對於速度的測量,請參閱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,至少。我現在想不到更快的方式,做得很好。

+0

使用'file'打開文件是什麼? – SilentGhost 2010-06-23 14:12:02

+0

在這個問題上,沒有提到這是Python 3代碼(因爲我從另一個答案的一條評論中發現它是這樣的)。因此,Lars明確地認爲它是Python 2.x(如果文件是完全有效的,如果可能不合意的話)。 – rbp 2010-06-23 14:25:22

2

更聰明的是不要影響file

+1

這段代碼是用py3k編寫的,沒有'file' – SilentGhost 2010-06-23 09:30:17

+1

也許他的意思是說OP通過確定結果列表來映射他自己的「打開文件的對象」(file = [something for line in文件])。在這段代碼中可能並不相關,但它當然不可取。當然,這也不是對這個問題的回答。 – rbp 2010-06-23 13:41:07

1

這取決於您在列表創建後將對列表做什麼。如果您只是要遍歷它,那麼使用生成器表達式可能會更好,因此您不會一次將整個文件加載到內存中。如果文件很大,則可能導致頁面交換或內存不足錯誤。

我已經通讀了您發佈的相關問題,並且在您閱讀完數據後可以看不到您想要解決什麼問題或您要對數據執行的操作。如果您給我們更多的背景,我們可能會提供更具體和有用的答案。

1

如果你只在第一空間之前出現(假設總是有一個)一切有興趣,你可以嘗試使用字符串索引:

[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 

但我仍然認爲指數是更好,因爲它清楚地表明你的意思(而不是分區,它給你,你馬上扔掉兩個額外的值)

+0

他們對我來說完全一樣 – SilentGhost 2010-06-23 14:09:36

+0

我剛剛添加了py3k測量,並提到速度差異不適用於它。也許這就是你正在經歷的? – rbp 2010-06-23 14:14:32

+0

這與py3k無關,我用python-2.6測試過,它給了我相同的值。 – SilentGhost 2010-06-23 14:22:17