给定两个字符串,删除与给定字符匹配的所有位置的最快方法是什么?

2024-04-27 02:30:16 发布

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

这是一个速度问题。你知道吗

我有两条相同长度的弦x和y。在某些位置(索引),它们可能具有相同的字符(例如,“A”)。我希望去掉这些角色,把剩下的挤在一起。你知道吗

例如,用句点(“.”)表示非A字符:

x = "....A..A....AA...A"
y = ".A.....A....AA...."

new_x,new_y=f(x,y)应返回:

new_x = "....A.........A"
new_y = ".A............."

目前,我使用一个zip/unzip和一个join来实现这一点,如下面的代码片段所示。但我发现这对我的需要来说太慢了,因为我需要一次做几十万次:

import timeit
setup = '''
from itertools import izip
x = 20*"....A..A....AA...A" # my actual strings are length 300-400, thus the 20*
y = 20*".A.....A....AA...."
def f(x, y, two_As=("A", "A")):
    new_x, new_y = izip(*(pair for pair in izip(x, y) if pair != two_As))
    new_x = "".join(new_x)
    new_y = "".join(new_y)
'''
>>> timeit.timeit('f(x, y)', setup=setup, number=int(1e5))
8.456903219223022

我试过的几件事并没有加快速度。缓存是一个选项(尽管您可能已经猜到,它并不总是相同的两个字符串!),但似乎这是一个非常简单的操作,如果方法正确,可能会大大加快速度。你知道吗

(我注意到大约80%的时间是由压缩/解压占用的,只有20%的时间是由随后的“.join()调用占用的,但是如果这也能加快速度,我洗耳恭听。)

我可以想象/不合理地希望这整件事不超过10微秒(100000个电话约1秒)。你知道吗


Tags: import角色newassetup时间字符速度