我想要一种有效的方法在Python中将一个字符串附加到另一个字符串.
var1 = "foo"
var2 = "bar"
var3 = var1 + var2
Run Code Online (Sandbox Code Playgroud)
有没有什么好的内置方法可供使用?
我在早期的帖子中询问了最有效的大规模动态字符串连接方法,我建议使用join方法,这是最好,最简单,最快速的方法(就像大家所说的那样).但是当我玩字符串连接时,我发现了一些奇怪的(?)结果.我确信事情正在发生,但我不能完全理解.这是我做的:
我定义了这些功能:
import timeit
def x():
s=[]
for i in range(100):
# Other codes here...
s.append("abcdefg"[i%7])
return ''.join(s)
def y():
s=''
for i in range(100):
# Other codes here...
s+="abcdefg"[i%7]
return s
def z():
s=''
for i in range(100):
# Other codes here...
s=s+"abcdefg"[i%7]
return s
def p():
s=[]
for i in range(100):
# Other codes here...
s+="abcdefg"[i%7]
return ''.join(s)
def q():
s=[]
for i in range(100):
# Other codes here...
s = s + ["abcdefg"[i%7]]
return ''.join(s) …Run Code Online (Sandbox Code Playgroud) 我正在评估外观和说序列的连续术语(更多关于它的信息:https : //en.wikipedia.org/wiki/Look-and-say_sequence)。
我使用了两种方法并对它们进行计时。在第一种方法中,我只是迭代每个术语来构建下一个。在第二个中,我曾经itertools.groupby()这样做过。时差相当大,所以我做了一个图来玩:
是什么让itertools.groupby()效率如此之高?两种方法的代码如下:
第一种方法:
def find_block(seq):
block = [seq[0]]
seq.pop(0)
while seq and seq[0] == block[0]:
block.append(seq[0])
seq.pop(0)
return block
old = list('1113222113')
new = []
version1_time = []
for i in range(40):
start = time.time()
while old:
block = find_block(old)
new.append(str(len(block)))
new.append(block[0])
old, new = new, []
end = time.time()
version1_time.append(end-start)
Run Code Online (Sandbox Code Playgroud)
方法二:
seq = '1113222113'
version2_time = []
def lookandread(seq):
new = ''
for value, group in itertools.groupby(seq):
new += '{}{}'.format(len(list(group)), …Run Code Online (Sandbox Code Playgroud) 我正在使用 timeit 对项目的一些代码进行基准测试(使用免费的 replit,因此需要 1024MB 内存):
\ncode = \'{"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"}}\nRun Code Online (Sandbox Code Playgroud)\n该循环针对给定图像内的每个像素运行(当然效率不高,但我还没有实现任何减少循环时间的方法),因此我可以在循环中获得的任何优化都是值得的。
\n我记得只要你组合 3 个以上的字符串\xe2\x80\x94,f 字符串就比字符串连接更快,如图所示,我组合了超过3个字符串\xe2\x80\x94,所以我决定将循环内的 += 替换为 f 字符串并查看改进。
\ncode = \'{"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) 我需要除去在字符string1中存在的string2。在这里string1,string2只有小写字符 az 在给定的条件下,string1每次的长度都会更大。
我正在使用in运营商:
def removeChars (string1, string2):
for char in string2:
if char in string1:
string1 = string1.replace(char, '')
return string1
Run Code Online (Sandbox Code Playgroud)
但我在 Stack Overflow 上读到一个答案,上面写着:
对于 list、tuple、set、frozenset、dict 或 collections.deque 等容器类型,表达式
x in y等效于any(x is e or x == e for e in y)。
这意味着in操作员for在幕后使用了一个循环。
所以我的问题是,在for我的代码循环中,我应该考虑使用嵌套for循环,因为in操作员for在后台使用循环吗?如果是,这个程序的时间复杂度是多少?