相关疑难解决方法(0)

s=s+c 字符串连接优化是如何决定的?

简短版本:如果s是字符串,则s = s + \'c\'可以就地修改字符串,但t = s + \'c\'不能。但是操作如何s + \'c\'知道它处于哪种场景呢?

\n

长版:

\n

t = s + \'c\'需要创建一个单独的字符串,因为程序随后需要旧字符串 ass和新字符串 as t

\n

s = s + \'c\'如果是唯一的引用,则可以就地修改字符串s,因为程序只想s成为扩展字符串。如果末尾有多余字符的空间,CPython 实际上会执行此优化。

\n

考虑这些重复添加字符的函数:

\n
def fast(n):\n    s = \'\'\n    for _ in range(n):\n        s = s + \'c\'\n        t = s\n        del t\n\ndef slow(n):\n    s = \'\'\n    for _ in range(n):\n        t = s …
Run Code Online (Sandbox Code Playgroud)

python performance cpython internals

18
推荐指数
1
解决办法
542
查看次数

在循环内重复添加字符串时,为什么 f 字符串比字符串连接慢?

我正在使用 timeit 对项目的一些代码进行基准测试(使用免费的 replit,因此需要 1024MB 内存):

\n
code = \'{"type":"body","layers":[\'\n\nfor x, row in enumerate(pixels):\n    for y, pixel in enumerate(row):\n        if pixel != (0, 0, 0, 0):\n            code += f\'\'\'{{"offsetX":{-start + x * gap},"offsetY":{start - y * gap},"rot":45,"size":{size},"sides":4,"outerSides":0,"outerSize":0,"team":"{\'#%02x%02x%02x\' % (pixel[:3])}","hideBorder":1}},\'\'\'\n    \ncode += \'],"sides":1,"name":"Image"}}\n
Run Code Online (Sandbox Code Playgroud)\n

该循环针对给定图像内的每个像素运行(当然效率不高,但我还没有实现任何减少循环时间的方法),因此我可以在循环中获得的任何优化都是值得的。

\n

我记得只要你组合 3 个以上的字符串\xe2\x80\x94,f 字符串就比字符串连接更快,如图所示,我组合了超过3个字符串\xe2\x80\x94,所以我决定将循环内的 += 替换为 f 字符串并查看改进。

\n
code = \'{"type":"body","layers":[\'\n\nfor x, row in enumerate(pixels):\n    for y, pixel in enumerate(row):\n        if pixel != (0, 0, 0, 0):\n            code = f\'\'\'{code}{{"offsetX":{-start + x …
Run Code Online (Sandbox Code Playgroud)

python string loops concatenation f-string

6
推荐指数
1
解决办法
576
查看次数