首页 > 解决方案 > 您将如何在 Assembly 中有效地重写此 python 代码

问题描述

因此,作为一个挑战,我发布了这个 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)

看看是否有人可以在 Assembly 中有效地重写它。python代码基本上做的是;它通过 NIZ1 并检查如果 NIZ 字符串的小写字母是 SEZNAM1 的元素,则将其替换为 SEZNAM2 的大写字母,与 SEZNAM1 中的位置相同。

你可以运行python代码来看看你是否得到正确的答案。

标签: pythonassembly

解决方案


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

尽管如此,在这里您还是在进行大量搜索,使用嵌套的 for 循环,一次使用.index内部循环。

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

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

那么算法就变成了:

for char in NIZ1
    NIZ2 += map[char]

在汇编或任何语言中,我会创建map一个数组。

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

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

推荐阅读