Python 代码的优化,包括从大文件中读取,然后用分隔符分割,然后使用保留格式加密每个字符串

问题描述 投票:0回答:1

我正在做一个项目,当我做格式保留加密(包括三种类型的字母、字母数字和数字)时,为了实现这一点,我编写了几个方法,然后我编写了一个将文件作为输入的方法,一个分隔符,我使用字符串方法“split()”按分隔符分割文件中的文本,并对每个字符串调用加密方法,加密调用很多其他方法来实现 FPE 加密,然后我打开另一个文件以在其上写入生成的加密文本。

问题是当我测试 100 万行的文本文件时,加密花了 18 分钟 我做了一些优化工作,例如我使用理解列表而不是 for 循环,因为它们更快,我试图避免对字符串进行操作,因为它们成本很高,结果是 8 分钟,这是一个很好的改进,但还不够,好吧,我想要使用 numba ,问题是我在类内部使用方法,而 @jit 不能正常工作(我有一些它不知道它们的对象),然后我尝试了 PyPy 广告,对于同一个文件,改进令人印象深刻我有2分10秒。 但它仍然太长了,因为然后我尝试了一个有 1000 万行的文件,并且使用 pypy 需要 28 分钟才能加密。 我该怎么做才能获得更快的速度???

部分代码:

    def tokenize_text(self, text, separator):
        encrypted = []
        for string in text.split(separator):
            encrypted.append(self.encrypt(string))
        return separator.join(encrypted)
    def tokenize_file(self, file, separator, output_file=None):
        with open(file, 'r', encoding='utf-8') as f1:
            text = f1.read()
        if output_file is None:
            base, ext = file.rsplit('.', 1)
            output_file = f"{base}_tokenized.{ext}"
        with open(output_file, 'w', encoding='utf-8') as f2:
            f2.write(self.tokenize_text(text, separator))
        return output_file
python performance optimization pypy memory-efficient
1个回答
0
投票

这里

def tokenize_text(self, text, separator):
    encrypted = []
    for string in text.split(separator):
        encrypted.append(self.encrypt(string))
    return separator.join(encrypted)

你正在重复

.append
list
,根据wiki.python.org

可能需要非常长的时间,具体取决于容器的历史记录。

你可以通过这样做来避免这种情况

return separator.join(map(self.encrypt,text.split(separator)))
© www.soinside.com 2019 - 2024. All rights reserved.