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