这行代码更智能/更快/更轻的替代品?

时间:2010-06-23 07:05:05

标签: python

file = [float(line.partition(' ')[0]) for line in file]

该文件是打开文件的对象......

thnq

4 个答案:

答案 0 :(得分:2)

更聪明的是不会影子file

答案 1 :(得分:1)

有关速度的测量,请参阅Python标准库模块时间:

$ 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更快,至少。我现在想不出更好的方法,做得好。

答案 2 :(得分:1)

这取决于您在创建列表后要对列表执行的操作。如果您只是要遍历它,那么使用生成器表达式可能会更好,这样您就不会立即将整个文件加载到内存中。如果文件很大,可能会导致页面交换或内存不足错误。

我已经阅读了您发布的相关问题,并且一旦您阅读了相关问题,就无法看到您尝试解决的问题或者您要对数据做什么。如果您给我们一些更多的背景信息,那么我们可以提供更具体和有用的答案。

答案 3 :(得分:1)

如果您只对第一个空格之前的所有内容感兴趣(假设总是有一个空格),您可以尝试使用字符串索引:

[float(line[:line.index(" ")]) for line in f]

借用Lars的测试,它比分区运行得更快:

rbp@apfelstrudel ~$ 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
rbp@apfelstrudel ~$ 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,速度差异与之无关:

rbp@apfelstrudel ~$ 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
rbp@apfelstrudel ~$ 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

但我仍然认为索引更好,因为它清楚地显示了你的意思(而不是分区,这会给你两个你立即扔掉的额外值)