Python 如何将字符串表示为数字?

Python 如何将字符串表示为数字?,python,python-2.7,python-3.x,numbers,Python,Python 2.7,Python 3.x,Numbers,我需要将一个字符串表示为一个数字,但是它的长度是8928313个字符,请注意,这个字符串可以包含的不仅仅是字母,我还必须能够高效地将其转换回。我当前的(太慢)代码如下所示: alpha = 'abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ,.?!@()+-=[]/*1234567890^*{}\'"$\\&#;|%<>:`~_' alphaLeng = len(alpha) def letterNumber(lett

我需要将一个字符串表示为一个数字,但是它的长度是8928313个字符,请注意,这个字符串可以包含的不仅仅是字母,我还必须能够高效地将其转换回。我当前的(太慢)代码如下所示:

alpha = 'abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ,.?!@()+-=[]/*1234567890^*{}\'"$\\&#;|%<>:`~_'
alphaLeng = len(alpha)
def letterNumber(letters):
    letters = str(letters)
    cof = 1
    nr = 0
    for i in range(len(letters)):
        nr += cof*alpha.find(letters[i])
        cof *= alphaLeng
        print(i,'        ',len(letters))
    return str(nr)
alpha='abcdefghijklmnopqrstuvwxyz abcdefghijklmnopqrstuvwxyz@()+-=[]/*1234567890^*{}\'"$\\&#;|%:`~_'
alphaLeng=len(alpha)
def字母编号(字母):
字母=str(字母)
cof=1
nr=0
对于范围内的i(len(字母)):
nr+=cof*alpha.find(字母[i])
cof*=字母长度
印刷品(i、、len(字母))
返回街(北)

如果只有ANSII字符。您可以使用
ord()
chr()


如果只有ANSII字符。您可以使用
ord()
chr()


您可以执行几种优化。例如,
find
方法需要在字符串中搜索对应的字母。字典会更快。甚至更快(基准!)可能是
chr
函数(如果您对字母顺序不太挑剔的话)还有
ord
函数来反转
chr
。但是如果您对排序不太挑剔,那么如果您不需要以任何特定格式显示值,最好将字符串填充为NULL,并将其作为一个大的二进制数存储在内存中

通过迭代字符而不是字符索引,您可能会获得一些加速。如果您使用的是Python2,则较大的
范围将很慢,因为需要生成列表(使用
xrange
而不是Python2);Python3使用生成器,因此效果更好

您的
print
函数将大大降低输出速度,尤其是当您将输出到tty时


一个大的数字库也可以为您带来加速:

您可以执行几种优化。例如,
find
方法需要在字符串中搜索相应的字母。字典会更快。甚至更快的可能是(基准!)
chr
函数(如果您对字母排序不太挑剔)和
ord
函数来反转
chr
。但是如果您对排序不挑剔,如果您不需要以任何特定格式显示值,则最好只保留NULL填充字符串,并将其视为内存中的一个大二进制数

通过迭代字符而不是字符索引,您可能会获得一些加速。如果您使用的是Python2,则较大的
范围将很慢,因为需要生成列表(使用
xrange
而不是Python2);Python3使用生成器,因此效果更好

您的
print
函数将大大降低输出速度,尤其是当您将输出到tty时

一个大的数字库也可以为您带来加速:

您的
alpha.find()
函数需要在每个循环上迭代
alpha

您可能可以通过使用
dict
加快速度,因为字典查找是O(1):

alpha='abcdefghijklmnopqrstuvwxyz abcdefghijklmnopqrstuvwxyz,.?!@+-=[]/*1234567890^*{}'“$\&&#|%:`
alpha_dict={字母:索引的索引,枚举中的字母(alpha)}
打印(alpha.find(“$”)
# 83
打印(alpha_dict['$'])
# 83
您的
alpha.find()
函数需要在每个循环上迭代
alpha

您可能可以通过使用
dict
加快速度,因为字典查找是O(1):

alpha='abcdefghijklmnopqrstuvwxyz abcdefghijklmnopqrstuvwxyz,.?!@+-=[]/*1234567890^*{}'“$\&&#|%:`
alpha_dict={字母:索引的索引,枚举中的字母(alpha)}
打印(alpha.find(“$”)
# 83
打印(alpha_dict['$'])
# 83

好吧,既然其他人给出了糟糕的答案,我就要插手了

  • 你不应该这样做
  • 你不应该这样做
  • 一个整数和一个字符数组最终是一样的:字节。你可以用同样的方式访问值
  • 大多数数字表示的上限为8字节(64位)。您看到的是8MB,或者是最大整数表示的一百万倍。您不应该这样做。真的
  • 你不应该这样做。你的号码将只是一个自定义的,巨大的号码类型,在引擎盖下是相同的
  • 如果你真的想做这件事,尽管有上面所有的原因,这里是如何
  • 代码

    def lshift(a, b):
        # bitwise left shift 8
        return (a << (8 * b))
    
    def string_to_int(data):
        sum_ = 0
        r = range(len(data)-1, -1, -1)
        for a, b in zip(bytearray(data), r):
            sum_ += lshift(a, b)
        return sum_;
    
    def L换档(a、b):
    #按位左移位8
    
    返回(a好的,因为其他人给出了糟糕的答案,所以我要介入

  • 你不应该这样做
  • 你不应该这样做
  • 一个整数和一个字符数组最终是一样的:字节。你可以用同样的方式访问值
  • 大多数数字表示的上限为8字节(64位)。您看到的是8MB,或者是最大整数表示的一百万倍。您不应该这样做。真的
  • 你不应该这样做。你的号码将只是一个自定义的,巨大的号码类型,在引擎盖下是相同的
  • 如果你真的想做这件事,尽管有上面所有的原因,这里是如何
  • 代码

    def lshift(a, b):
        # bitwise left shift 8
        return (a << (8 * b))
    
    def string_to_int(data):
        sum_ = 0
        r = range(len(data)-1, -1, -1)
        for a, b in zip(bytearray(data), r):
            sum_ += lshift(a, b)
        return sum_;
    
    def L换档(a、b):
    #按位左移位8
    
    返回(请注意,这段代码很好用,太慢了,我认真地问你为什么需要一个精度约为8MB的数字。归根结底,字符串和数字都是字节。字符串是你想要的数据类型。你是在使用Python 3还是Python 2?我想你没有同时使用这两种类型?请注意,这段代码很好用,太慢了,我认真地问你为什么不使用它。)一个精度约为8MB的数字。最终,字符串和数字都是字节。字符串是您想要的数据类型。您使用的是Python 3还是Python 2?我假设您没有同时使用这两种类型?
    ord