python - 是否可以在python中将一个非常大的int快速转换为一个字符串

标签 python

我正在构建一个生成大量整数的加密程序。它看起来像这样:

a = plaintextOrd**bigNumber

当我做

a = str(a)

需要28分钟以上。

有没有办法比使用内置的 str() 函数更快地转换这样的整数?

我需要它是一个字符串的原因是因为这里的这个函数:

def divideStringIntoParts(parts,string):
    parts = int(parts)
    a = len(string)//parts

    new = []
    firstTime = True
    secondTime = True
    for i in range(parts):
        if firstTime:
            new.append(string[:a])
            firstTime = False
        elif secondTime:
            new.append(string[a:a+a])
            secondTime = False
        else:
            new.append(string[a*i:a*(i+1)])

    string2 = ""
    for i in new:
        for i in i:
            string2 += i

    if len(string2) - len(string) != 0:
        lettersNeeded = len(string) - len(string2)
        for i in range(lettersNeeded):
            new[-1] += string[len(string2) + i] 

    return new

最佳答案

您在评论中写道,您希望以十进制格式获取整数的长度。您不需要将此整数转换为字符串,您可以使用 "common logarithm" 代替:

import math
math.ceil(math.log(a, 10))

此外,如果您知道:
a = plaintextOrd**bigNumber

那么 math.log(a, 10) 等于 math.log(plaintextOrd, 10) * bigNumber ,计算时间不应超过几毫秒:
>>> plaintextOrd = 12345
>>> bigNumber = 67890
>>> a = plaintextOrd**bigNumber
>>> len(str(a))
277772
>>> import math
>>> math.ceil(math.log(a, 10))
277772
>>> math.ceil(math.log(plaintextOrd, 10) * bigNumber)
277772

即使 a 不适合您的硬盘驱动器,它也应该可以工作:
>>> math.ceil(math.log(123456789, 10) * 123456789012345678901234567890)
998952457326621672529828249600

正如@kaya3 所提到的,Python 标准浮点数不够精确,无法描述如此大的数字的确切长度。

您可以使用 mpmath (任意精度浮点运算)来获得所需精度的结果:
>>> from mpmath import mp
>>> mp.dps = 1000
>>> mp.ceil(mp.log(123456789, 10) * mp.mpf('123456789012345678901234567890'))
mpf('998952457326621684655868656199.0')

关于python - 是否可以在python中将一个非常大的int快速转换为一个字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59009244/

相关文章:

python - Scrapy 排除包含特定文本的 URL

Python套接字和测量接收到的字节数

Python 在 macOS 上获取 GPS 位置

python - 使用Python将JSON转换为CSV

python - 如何在 Python 中用 subprocess.call 替换 os.system ("mkdir "_testName)?

python - 基于 str.find 的 Pandas 切片字符串作为开始和停止的位置

python - 使用 Python 解析电子邮件

python - Scrapy 爬取带有 PostBack 数据 javascript url 的页面不会改变

python - pydot 和 graphviz 错误 : Couldn't import dot_parser, 无法加载点文件

python - 为什么我老化的 Django 1.3.1 站点在迁移到新服务器后说 '' TemplateDoesNotExist at/admin/“?