データをコピーするだけで非常に長い数値を文字列に変換する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)
構造体モジュールが必要です。
packed = struct.pack('l', 123456)
assert struct.unpack('l', packed)[0] == 123456
実際、 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 モジュールに含まれていない理由がわかりません。間違っている場合は修正してください。
どうですか
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)
私はそれを計りませんでしたが、再帰を使用しないため、より高速で、より大きな数でも動作するはずです。
高速なシリアル化が必要な場合は、マーシャルモジュールを使用してください。あなたの方法よりも約400倍高速です。
文字列形式は気にしないと思いますが、シリアル化が必要ですか? もしそうなら、Python の組み込みシリアライザーであるcPickleモジュールを使用してみませんか? このdumps
関数は、長い整数を含む任意の Python オブジェクトを文字列に変換しloads
ます。関数はその逆です。ファイルに保存するためにこれを行っている場合は、dump
およびload
関数も確認してください。
>>> import cPickle
>>> print cPickle.loads(cPickle.dumps(13**666)) % 666
73
>>> print (13**666) % 666
73
cPickle
vsのパフォーマンス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
はるかに高速です。