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

Python 给定两个字符串,删除它们都与给定字符匹配的所有位置的最快方法是什么?,python,string,performance,python-2.7,replace,Python,String,Performance,Python 2.7,Replace,这是一个速度问题 我有两个长度相同的字符串x和y。在某些位置(索引),它们可能具有相同的字符(例如,“A”)。我希望去掉这些角色,把剩下的挤在一起 例如,用句点(“.”)表示非A字符: new_x,new_y=f(x,y)应返回: new_x = "....A.........A" new_y = ".A............." 目前,我使用一个zip/unzip和一个join来实现这一点,如下面的代码片段所示。但我发现这对于我的需要来说太慢了,因为我需要一次做几十万次: import t

这是一个速度问题

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

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

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%的时间,而后续的“.join()调用只占用了20%,但如果可以加快速度,我会洗耳恭听。)


我可以想象/不合理地希望整个过程所需时间不超过10微秒(100000次呼叫约1秒)。

他们总是只有
A
?@EricDuminil:没有;字符串可以包含任何字母。然而,我只想删除一封信。也就是说,在上面的例子中,“.”可以是除“A”以外的任何字母,而我只想删除“A”(但只有当它出现在两个字符串中的同一个位置)时,您可能会考虑使用Cython来实现这一点。我尝试将字符串转换为二进制,并计算
b1和b2
以获得
0000000 1000011000
,这没有多大帮助,而且比您的方法慢。@user1071516:您的代码不是用C编写的,尤其是
(izip中成对(x,y)如果成对!=two_As)
。这需要经过大量冗余的类型检查、对象创建和动态分配,而C实现可以绕过这些。
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