मैं अजगर में एक बाइट्स के एक स्ट्रिंग को इंट में कैसे बदल सकता हूं?
इस तरह कहें: 'y\xcc\xa6\xbb'
मैं इसे करने का एक चतुर / मूर्ख तरीका लेकर आया:
sum(ord(c) << (i * 8) for i, c in enumerate('y\xcc\xa6\xbb'[::-1]))
मुझे पता है कि वहाँ कुछ अंतर्निहित या मानक पुस्तकालय में होना चाहिए जो इसे और अधिक सरलता से करता है ...
यह हेक्स अंकों की एक स्ट्रिंग को परिवर्तित करने से अलग है जिसके लिए आप int (xxx, 16) का उपयोग कर सकते हैं, लेकिन इसके बजाय मैं वास्तविक बाइट मानों की एक स्ट्रिंग को परिवर्तित करना चाहता हूं।
अपडेट करें:
मुझे जेम्स की तरह का जवाब थोड़ा बेहतर लगता है क्योंकि इसे दूसरे मॉड्यूल को आयात करने की आवश्यकता नहीं होती है, लेकिन ग्रेग का तरीका तेज है:
>>> from timeit import Timer
>>> Timer('struct.unpack("<L", "y\xcc\xa6\xbb")[0]', 'import struct').timeit()
0.36242198944091797
>>> Timer("int('y\xcc\xa6\xbb'.encode('hex'), 16)").timeit()
1.1432669162750244
मेरी हैकी विधि:
>>> Timer("sum(ord(c) << (i * 8) for i, c in enumerate('y\xcc\xa6\xbb'[::-1]))").timeit()
2.8819329738616943
अन्य अद्यतन:
किसी ने टिप्पणियों में पूछा कि किसी अन्य मॉड्यूल को आयात करने में क्या समस्या है। ठीक है, एक मॉड्यूल आयात करना जरूरी नहीं है कि सस्ता हो, एक नज़र डालें:
>>> Timer("""import struct\nstruct.unpack(">L", "y\xcc\xa6\xbb")[0]""").timeit()
0.98822188377380371
मॉड्यूल को आयात करने की लागत सहित इस पद्धति के लगभग सभी लाभों की उपेक्षा करता है। मेरा मानना है कि इसमें पूरे बेंचमार्क रन के लिए एक बार इसे आयात करने का खर्च शामिल होगा; देखो क्या होता है जब मैं इसे हर बार पुनः लोड करने के लिए मजबूर करता हूं:
>>> Timer("""reload(struct)\nstruct.unpack(">L", "y\xcc\xa6\xbb")[0]""", 'import struct').timeit()
68.474128007888794
कहने की जरूरत नहीं है, अगर आप इस पद्धति के बहुत सारे निष्पादन प्रति आयात कर रहे हैं, तो यह आनुपातिक रूप से एक समस्या से कम हो जाता है। यह शायद सीपीयू के बजाय i / o लागत है इसलिए यह विशेष मशीन की क्षमता और लोड विशेषताओं पर निर्भर हो सकता है।
int.from_bytes) आउट-प्रदर्शन किया struct.unpack। अधिक पठनीय इमो के आगे।