h*******c 发帖数: 248 | 1 最近在学python,格式上的古怪要求我还能接受,(以前fortran比这个烦),但不能
直接改string真是比较烦。逻辑上无所谓,可以分成片,再联起来。可如果string比较
长,这种干什么都要copy的做法太没效率了。3.0现在还太不普及,开发项目,不能用
bytearray。烦死了。除了这个,我也没看出3.0有什么好。
总体上还是比较喜欢python设计上逻辑的一致性,dynamic typing在实现上很清晰。感
觉python确实像是学数学的人弄出来。 |
r****t 发帖数: 10904 | 2 So people invented ruby...
【在 h*******c 的大作中提到】 : 最近在学python,格式上的古怪要求我还能接受,(以前fortran比这个烦),但不能 : 直接改string真是比较烦。逻辑上无所谓,可以分成片,再联起来。可如果string比较 : 长,这种干什么都要copy的做法太没效率了。3.0现在还太不普及,开发项目,不能用 : bytearray。烦死了。除了这个,我也没看出3.0有什么好。 : 总体上还是比较喜欢python设计上逻辑的一致性,dynamic typing在实现上很清晰。感 : 觉python确实像是学数学的人弄出来。
|
g*****g 发帖数: 34805 | 3 immutable string is not a problem, you just need a mutable string
builder when you need efficiency. Actually immutable string improves
memory efficiency, there's only one copy in the VM.
For java you can find StringBuilder/StringBuffer, I guess python
would have something similar.
【在 h*******c 的大作中提到】 : 最近在学python,格式上的古怪要求我还能接受,(以前fortran比这个烦),但不能 : 直接改string真是比较烦。逻辑上无所谓,可以分成片,再联起来。可如果string比较 : 长,这种干什么都要copy的做法太没效率了。3.0现在还太不普及,开发项目,不能用 : bytearray。烦死了。除了这个,我也没看出3.0有什么好。 : 总体上还是比较喜欢python设计上逻辑的一致性,dynamic typing在实现上很清晰。感 : 觉python确实像是学数学的人弄出来。
|
c*m 发帖数: 1114 | 4 .net里面的string也是immutable的,这个好像是趋势。原因是string支持连接等操作,
定义成immutable可以避免出现一个string一部分在内存这里,一部分在那里的内存处理
麻烦。。
分片连起来的话可以用stringbuilder,不影响效率。
【在 h*******c 的大作中提到】 : 最近在学python,格式上的古怪要求我还能接受,(以前fortran比这个烦),但不能 : 直接改string真是比较烦。逻辑上无所谓,可以分成片,再联起来。可如果string比较 : 长,这种干什么都要copy的做法太没效率了。3.0现在还太不普及,开发项目,不能用 : bytearray。烦死了。除了这个,我也没看出3.0有什么好。 : 总体上还是比较喜欢python设计上逻辑的一致性,dynamic typing在实现上很清晰。感 : 觉python确实像是学数学的人弄出来。
|
r****t 发帖数: 10904 | 5 Seriously, strings in python need to be immutable, otherwise they cannot
be used as keys of dicts. I did not know 3.0 has string mutable now.
For your need, StringIO/struct may work just fine. Its there for years. Or
maybe you need to switch to use list instead of string.
【在 h*******c 的大作中提到】 : 最近在学python,格式上的古怪要求我还能接受,(以前fortran比这个烦),但不能 : 直接改string真是比较烦。逻辑上无所谓,可以分成片,再联起来。可如果string比较 : 长,这种干什么都要copy的做法太没效率了。3.0现在还太不普及,开发项目,不能用 : bytearray。烦死了。除了这个,我也没看出3.0有什么好。 : 总体上还是比较喜欢python设计上逻辑的一致性,dynamic typing在实现上很清晰。感 : 觉python确实像是学数学的人弄出来。
|
h*******c 发帖数: 248 | 6 import sys
for line in sys.stdin:
if float(line[25:37])<10.0:
print "%s%12.2f" % (line[0:25],float(line[25:37])+10)
比如上面这个。运行速度不到perl的一半。有什么好办法吗?
【在 r****t 的大作中提到】 : Seriously, strings in python need to be immutable, otherwise they cannot : be used as keys of dicts. I did not know 3.0 has string mutable now. : For your need, StringIO/struct may work just fine. Its there for years. Or : maybe you need to switch to use list instead of string.
|
h*******c 发帖数: 248 | 7 3.0有bytearray。这个显然是mutable的。我不反对string immutable,但2.x没有一个
类似buffer的结构,还是很不方便。我这几天一直在反思自己是不是被c之类的
variable概念毒害太深了。实际上我大概想要的是个bytearray,或者buffer,不是
string.
【在 r****t 的大作中提到】 : Seriously, strings in python need to be immutable, otherwise they cannot : be used as keys of dicts. I did not know 3.0 has string mutable now. : For your need, StringIO/struct may work just fine. Its there for years. Or : maybe you need to switch to use list instead of string.
|
O*******d 发帖数: 20343 | |
r****t 发帖数: 10904 | 9 Time spent on:
1. redundent indexing into strings. "line[25:37]"
2. redundent type conversion of string to floats, calling float twice.
3. addition of a float and a int, involving upcast of types; this may
not give a performance hit though.
Perl could be faster in these aspects since it does not care about
typing, so saving time in all 1,2,3.
I am still surprised that python cannot match half of speed of perl
here. I see these operations and the style of coding easily easy for
a JIT comp
【在 h*******c 的大作中提到】 : import sys : for line in sys.stdin: : if float(line[25:37])<10.0: : print "%s%12.2f" % (line[0:25],float(line[25:37])+10) : 比如上面这个。运行速度不到perl的一半。有什么好办法吗?
|
h*******c 发帖数: 248 | 10 谢谢详细解答。
我在amd64上,而且没有root权限。psyco没法试。按你的意见改进了code,提高不太显
著。还有开始搞错了,最初的python code,比perl的两倍的时间还是稍快的。具体如
下:
Test data: 153195875 lines
Original Python code: 11m52.809s
Perl code: 6m50.634s
Python with introducing a float: 11m10.084s
Perl version |
r****t 发帖数: 10904 | 11 1. for loop overhead 严重,list comprehension is much faster, 但是你这个 looping body 又太简单,print 也还不是 function.
(print('...'%(a,b)) for a,b in sys.stdin if float(a)<10)
这样如果looping body 复杂点是个 function call 的话,这样写就可以除掉 for loop overhead.
2. 如果用 itertools.ifiler, 你可以把 if a<10: 也搞到 c 里面,应该也会快一些。
3. 另外,这个问题连 27:35 都已知,一次可以读多行视内存大小定,转成 array, 缩短时间到 1/5 应该不是难事。
【在 h*******c 的大作中提到】 : 谢谢详细解答。 : 我在amd64上,而且没有root权限。psyco没法试。按你的意见改进了code,提高不太显 : 著。还有开始搞错了,最初的python code,比perl的两倍的时间还是稍快的。具体如 : 下: : Test data: 153195875 lines : Original Python code: 11m52.809s : Perl code: 6m50.634s : Python with introducing a float: 11m10.084s : Perl version
|