如何在汇编中高效地重写此python代码

如何在汇编中高效地重写此python代码,python,assembly,Python,Assembly,因此,作为一项挑战,我将发布以下python代码: NIZ1 = 'yxem Nx yzcdxo, am knxfx Vcjs, Gbnnws rx ejnm nj Zxcj' SEZNAM1 = 'xfjrmansobyzcdwke' SEZNAM2 = 'adegiklmnoprstuvz' NIZ2 = '' for char in NIZ1: if char.islower(): for

因此,作为一项挑战,我将发布以下python代码:

NIZ1 = 'yxem Nx yzcdxo, am knxfx Vcjs, Gbnnws rx ejnm nj Zxcj'
    SEZNAM1 = 'xfjrmansobyzcdwke'
    SEZNAM2 = 'adegiklmnoprstuvz'

    NIZ2 = ''

        for char in NIZ1:
            if char.islower():
                for e in SEZNAM1:
                    if char == e:
                        NIZ2  += SEZNAM2[SEZNAM1.index(char)]
            else:
                NIZ2 += char

        print(NIZ2)
看看是否有人能在汇编中高效地重写它。 python代码的基本功能是:;它遍历NIZ1并检查NIZ字符串的小写字母是否是SEZNAM1的元素,将其替换为SEZNAM2的大写字母,其位置与SEZNAM1中的位置相同


您可以运行python代码以查看是否得到正确答案。

性能是通过做更少工作或分散负载的算法来实现的,有时还通过汇编或其他语言的特殊功能来实现

尽管如此,在这里您仍在进行大量搜索,使用嵌套for循环,在内部循环中使用
.index

使用算法的另一种方法,我们可以避免除外部循环以外的所有循环:

创建输入字符到输出字符的映射,因此对于“a”的输入,输出“x”,对于“d”输出“f”,等等。。对于大写字母、标点符号和所有其他符号,输出值与输入值相同

然后,算法变为:

for char in NIZ1
    NIZ2 += map[char]
在汇编语言或任何语言中,我都会制作
map
数组

接下来,您需要查看
+=
操作,它执行字符串追加,这可能非常低效。因此,我们更愿意在循环外部(和之前)预先为
NIZ2
分配空间,我们可以这样做,因为我们知道我们需要与输入字符串
NIZ1
相同的大小

i = 0
for char in NIZ1
    NIZ2[i++] = map[char]             # update 1 char instead of string append

这不是一个问题,因此不是StackOverflow的主题。请看,请不要破坏你的问题。如果我们知道所有替换都是小写ASCII字母,我们可以使用两个
pshufb
查找混合在一起进行矢量化,以覆盖包含非标识映射的32个字符范围。(假设x86具有SSSE3或AVX,或者NEON具有vtbx)。带有
vpermb
的AVX512VBMI可以在1ymm洗牌中完成,并基于范围检查比较进行混合。实际上,对于
vpermw-zmm
,AVX512BW可以扩展到32 x 16位元素,尽管这更像是洗牌,而且
vpermw
比IceLake上的
vpermb
慢,原因很奇怪:2个uops@彼得考德斯,很好!