由买买提看人间百态

boards

本页内容为未名空间相应帖子的节选和存档,一周内的贴子最多显示50字,超过一周显示500字 访问原贴
Programming版 - 没人觉得python的string是immutable不爽吗?
相关主题
Python Q: function pass in struct pointer, come back with data filled关于FP
python 区别于其他语言的根本?也谈OOP跟FP之争
学python要学到什么程度才算professional?OOP里面的Object其实是actor
对 (im)mutability 的误解和深度理解mutating input argument不应该鼓励吧
FP更接近人的思维criticism of Scala
包子,能否在Python 里生成一个csv 文件,并将它放在一个server 的directory 下?函数式语言是不是特别费系统资源?
这个python code能否优化去掉file writeclojure和common lisp区别大么,语法上。
从今天开始起,学C++!这么说吧,fp不是否定变量,而是控制变量的范围
相关话题的讨论汇总
话题: string话题: python话题: immutable话题: perl话题: float
进入Programming版参与讨论
1 (共1页)
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
8
记得Java的String也是不可改变的。
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

1 (共1页)
进入Programming版参与讨论
相关主题
这么说吧,fp不是否定变量,而是控制变量的范围FP更接近人的思维
有人用clj写web么?比如用luminus,ring这些框架包子,能否在Python 里生成一个csv 文件,并将它放在一个server 的directory 下?
1st class citizen这个python code能否优化去掉file write
go也是三种paradigm混合的语言从今天开始起,学C++!
Python Q: function pass in struct pointer, come back with data filled关于FP
python 区别于其他语言的根本?也谈OOP跟FP之争
学python要学到什么程度才算professional?OOP里面的Object其实是actor
对 (im)mutability 的误解和深度理解mutating input argument不应该鼓励吧
相关话题的讨论汇总
话题: string话题: python话题: immutable话题: perl话题: float