是否有任何lib将非常长的数字转换为只复制数据的字符串?
这些单行太慢了:
def xlong(s):
return sum([ord(c) << e*8 for e,c in enumerate(s)])
def xstr(x):
return chr(x&255) + xstr(x >> 8) if x else ''
print xlong('abcd'*1024) % 666
print xstr(13**666)
答案 0 :(得分:4)
你想要结构模块。
packed = struct.pack('l', 123456)
assert struct.unpack('l', packed)[0] == 123456
答案 1 :(得分:2)
怎么样
from binascii import hexlify, unhexlify
def xstr(x):
hex = '%x' % x
return unhexlify('0'*(len(hex)%2) + hex)[::-1]
def xlong(s):
return int(hexlify(s[::-1]), 16)
我没有时间,但它应该更快,也适用于更大的数字,因为它不使用递归。
答案 2 :(得分:2)
事实上,我缺乏长(s,256)。我潜伏更多,看到Python CAPI文件“longobject.h”中有2个函数:
PyObject * _PyLong_FromByteArray( const unsigned char* bytes, size_t n, int little_endian, int is_signed);
int _PyLong_AsByteArray(PyLongObject* v, unsigned char* bytes, size_t n, int little_endian, int is_signed);
他们完成这项工作。我不知道为什么没有包含在某些python模块中,或者如果我错了就纠正我。
答案 3 :(得分:1)
如果需要快速序列化,请使用marshal模块。它比你的方法快了大约400倍。
答案 4 :(得分:0)
我猜你不关心字符串格式,你只想要序列化?如果是这样,为什么不使用Python的内置序列化程序cPickle模块? dumps
函数会将包含长整数的任何python对象转换为字符串,loads
函数则反转。如果您要保存到文件,请查看dump
和load
功能。
>>> import cPickle
>>> print cPickle.loads(cPickle.dumps(13**666)) % 666
73
>>> print (13**666) % 666
73
答案 5 :(得分:-1)
cPickle
与marshal
的性能(Python 2.5.2,Windows):
python -mtimeit -s"from cPickle import loads,dumps;d=13**666" "loads(dumps(d))"
1000 loops, best of 3: 600 usec per loop
python -mtimeit -s"from marshal import loads,dumps;d=13**666" "loads(dumps(d))"
100000 loops, best of 3: 7.79 usec per loop
python -mtimeit -s"from pickle import loads,dumps;d= 13**666" "loads(dumps(d))"
1000 loops, best of 3: 644 usec per loop
marshal
要快得多。