Python 中 string += 'a' 这种写法效率很低吗?

2020-07-30 13:04:21 +08:00
 Alpacino

在别的论坛上看见:“你 python for loop 还 string += “a”,这一下子就暴露不科班了。” 这个说法。

4675 次点击
所在节点    问与答
42 条回复
gwy15
2020-07-30 13:08:25 +08:00
py str 不可变,如果要拼接字符串,类似 java 的 sb,用 List[str] 再 join 。
sagaxu
2020-07-30 13:09:48 +08:00
随便什么语言这么写都慢
Procumbens
2020-07-30 13:10:16 +08:00
@sagaxu C++不慢
sagaxu
2020-07-30 13:12:10 +08:00
@Procumbens C++也慢,这种写法不能提前分配好长度合适的内存
realityone
2020-07-30 13:14:41 +08:00
Hstar
2020-07-30 13:19:38 +08:00
是 for loop 结合 string += 'a' 在 python 中慢
假设目前 string 为 "aa"内存地址是 a1,在一次+=之后会生成一个新的字符串对象 "aaa" 存在 a2 并将 string 指向 a2
所以 for loop 套 += 字符串操作会产生 N 个字符串对象的创建操作,效率较慢
deorth
2020-07-30 13:23:55 +08:00
所以说怎样写才快
binux
2020-07-30 13:29:59 +08:00
@sagaxu #2 js 在 v8 下不慢
STRRL
2020-07-30 13:32:10 +08:00
反对这种写个 += 就暴露什么科班不科班。。
过早优化乃万恶之源
JeffGe
2020-07-30 13:37:24 +08:00
@realityone 我看这里面写的是 Python 2
CallMeReznov
2020-07-30 13:43:50 +08:00
所以说怎样写才快?
heygum97
2020-07-30 13:49:09 +08:00
我寻思搜索引擎是不好用吗 这种问题
djFFFFF
2020-07-30 13:53:09 +08:00
这不一定是说效率低吧,python 语法糖比较多,for loop 三四行的代码很多时候 list comprehension 一行代码就搞定了
binbinyouliiii
2020-07-30 13:53:13 +08:00
正式项目不能这么写,自己为了 debug 随便你
marcong95
2020-07-30 13:53:38 +08:00
所以所谓的科班就要先 malloc 再 strcat 么(手动滑稽)

我寻思着 string.join 也不怎么科班吧?可能我上课没听课(++手动滑稽)
love
2020-07-30 13:56:41 +08:00
python 本身就效率很低,就不用追求这么细了吧
Vegetable
2020-07-30 14:09:23 +08:00
https://gist.github.com/luliangce/f33d175e5a53db83ee2d2af91d3711be

这和循环的规模有很明显的关系。
单个循环次数比较小时,直接拼接效果更好,循环次数达到一定量级之后使用列表才有意义,这个量级我测试大概在 1000 左右,而且持续提高规模并不会明显提高差距。
楼上给的测试链接看起来,并不是很具有代表意义。
Trim21
2020-07-30 14:12:08 +08:00
正经项目拼接字符串都是用 StringIO 的吗
iyaozhen
2020-07-30 14:43:59 +08:00
2.6 好像就有优化过了,你可以试试,实际不慢(或者没那么夸张)
该用还是用,一般循环次数也是有限,肯定不是性能问题的大头,甚至末尾都算不上
misaka19000
2020-07-30 14:53:08 +08:00
反编译看一下字节码不就知道了

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/694317

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX