字符串连接执行器

2024-07-03 06:52:23 发布

您现在位置:Python中文网/ 问答频道 /正文

现在我使用一个列表来存储修改后的字符串,并返回一个带有.join()的字符串

def applyCoder(text, coder):
    l = []
    for i in text:
        if i in coder:
            l.append(coder[i])
        else:
            l.append(i)
    return ''.join(l)

# example output, shifts all letters by 3 in a string
# print applyCoder("Hello, world!", buildCoder(3))
# buildCoder(3) returns dictionary, e.g. {'A': 'D', ...}
# >>> Khoor, zruog!

有没有更快的方法来更改和返回字符串?你知道吗


Tags: 字符串textin列表forreturnifexample
1条回答
网友
1楼 · 发布于 2024-07-03 06:52:23

这应该尽可能快:

''.join([coder[i] if i in coder else i for i in text])

for循环相比,Python中的列表理解要优化得多,因为for循环的开销很大。我已经通过了列表理解,而不是''.join中的生成器,因为它必须在加入之前提前知道输入的长度。如果你给它一个生成器,它必须把它放到一个列表中(这有点慢)。你知道吗

实际上,您可以进一步简化它,它应该更快 (由于方法调用,这实际上比上述方法执行得慢)

''.join([coder.get(i,i) for i in text])

时间安排:

def applyCoder(text, coder):
    L = []
    for i in text:
        if i in coder:
            L.append(coder[i])
        else:
            L.append(i)
    return ''.join(L)

def list_comp(text, coder):
    return ''.join([coder[i] if i in coder else i for i in text])

def list_comp2(text, coder):
    return ''.join([coder.get(i,i) for i in text])

from timeit import timeit
from string import ascii_letters
d = dict(zip(ascii_letters, ascii_letters[3:] + ascii_letters[-3:]))


print timeit(stmt='applyCoder("Hello, world!", d)',
             setup='from __main__ import applyCoder, d;')

print timeit(stmt='list_comp("Hello, world!", d)',
             setup='from __main__ import list_comp, d;')    

print timeit(stmt='list_comp2("Hello, world!", d)',
             setup='from __main__ import list_comp2, d;')

print timeit(stmt='applyCoder("Hello, world!"*10, d)',
             setup='from __main__ import applyCoder, d;')

print timeit(stmt='list_comp("Hello, world!"*10, d)',
             setup='from __main__ import list_comp, d;')


print timeit(stmt='list_comp2("Hello, world!"*10, d)',
             setup='from __main__ import list_comp2, d;')

结果:

''' Test 1 '''
5.0159105417    # applyCoder
3.41502481461   # listcomp1
4.76796932292   # listcomp2

''' Test 2 '''
34.9718502631   # applyCoder
22.0451702661   # listcomp1
34.1682597928   # listcomp2

coder.get的方法调用似乎完全否定了列表理解的优点。我确实预测它可能会比listcomp1慢,因为这样,但我不认为它会有这么大的影响。不管怎样,名单还是赢了。你知道吗

更新: 如果您这样修改list_comp2

def list_comp2(text, coder):
    coder_get = coder.get
    return ''.join([coder_get(i,i) for i in text])

时代大为改善:

4.76796932292(第一次测试)->;3.95217394948

34.1682597928(第二次测试)->;27.1162974624

相关问题 更多 >