2008-11-30 33 views
6

Có lib nào chuyển đổi các số rất dài thành chuỗi chỉ sao chép dữ liệu không?dài <-> str chuyển đổi nhị phân

Những một lớp lót là quá chậm:

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) 

Trả lời

4

Bạn muốn module struct.

packed = struct.pack('l', 123456) 
assert struct.unpack('l', packed)[0] == 123456 
+0

Nó sẽ không hoạt động với số lượng lớn, ví dụ: 13 ** 666 – jfs

2

Làm thế nào về

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) 

tôi không gian nó nhưng nó cần được nhanh hơn và cũng làm việc trên con số lớn hơn, vì nó không sử dụng đệ quy.

0

Tôi đoán bạn không quan tâm đến định dạng chuỗi, bạn chỉ muốn tuần tự hóa? Nếu vậy, tại sao không sử dụng bộ nối tiếp tích hợp sẵn của Python, mô-đun cPickle? Hàm dumps sẽ chuyển đổi bất kỳ đối tượng python nào bao gồm số nguyên dài thành chuỗi và hàm loads là nghịch đảo của nó. Nếu bạn đang thực hiện việc này để lưu vào một tệp, hãy xem các hàm dumpload.

>>> import cPickle 
>>> print cPickle.loads(cPickle.dumps(13**666)) % 666 
73 
>>> print (13**666) % 666 
73 
1

Nếu bạn cần sử dụng tuần tự nhanh marshal mô-đun. Đó là khoảng 400x nhanh hơn so với phương pháp của bạn.

-1

Hiệu suất của 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 là nhanh hơn nhiều.

+6

Chỉ khi bạn sử dụng nó một cách ngây thơ. pickle mặc định thành một giao thức tương thích ngược về văn bản. Sử dụng cPickle.dumps (d, -1) và thời gian trở nên cạnh tranh: trên máy của tôi, 4.63 usec/loop cho cPickle và 3.34 usec/loop cho nguyên soái. –

2

Thực tế, tôi thiếu một số thời gian dài (s, 256). Tôi ẩn nấp và thấy rằng có 2 hàm trong tệp Python CAPI "longobject.h":

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

Chúng thực hiện công việc. Tôi không biết tại sao không có trong một số mô-đun python, hoặc sửa tôi nếu tôi là sai.

+1

Trong Python3 có các phương thức 'int.from_bytes' /' int.to_bytes'. http://docs.python.org/dev/py3k/library/stdtypes.html?highlight=int.from_bytes#int.to_bytes – jfs

Các vấn đề liên quan