6

是否有任何库可以将很长的数字转换为仅复制数据的字符串?

这些单线太慢了:

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)
4

6 回答 6

4

你想要结构模块。

packed = struct.pack('l', 123456)
assert struct.unpack('l', packed)[0] == 123456
于 2008-11-30T15:45:53.157 回答
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)

我没有计时,但它应该更快并且也可以处理更大的数字,因为它不使用递归。

于 2008-11-30T16:13:23.413 回答
2

事实上,我缺少 long(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模块中没有包含,或者如果我错了,请纠正我。

于 2008-12-14T14:13:38.500 回答
1

如果您需要快速序列化,请使用marshal模块。它比您的方法快 400 倍左右。

于 2008-11-30T17:21:12.370 回答
0

我猜你不关心字符串格式,你只是想要一个序列化?如果是这样,为什么不使用 Python 的内置序列化程序cPickle模块呢?该dumps函数会将包括长整数在内的任何 python 对象转换为字符串,该loads函数是它的逆函数。如果您这样做是为了保存到文件中,也请查看dumpandload函数。

>>> import cPickle
>>> print cPickle.loads(cPickle.dumps(13**666)) % 666
73
>>> print (13**666) % 666
73
于 2008-11-30T17:11:41.547 回答
-1

cPicklemarshal(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快得多。

于 2008-11-30T18:01:58.060 回答