我想將一個值表示爲一個64位有符號的long
,使得大於(2 ** 63)-1的值表示爲負數,但Python long
具有無限精度。是否有一個「快速」的方式來實現這一目標?Python類型長對C'long long'
11
A
回答
13
你可以使用ctypes.c_longlong
:
>>> from ctypes import c_longlong as ll
>>> ll(2 ** 63 - 1)
c_longlong(9223372036854775807L)
>>> ll(2 ** 63)
c_longlong(-9223372036854775808L)
>>> ll(2 ** 63).value
-9223372036854775808L
這真是只有,如果你的選擇確信在目標機器上signed long long
將是64位寬。
編輯:jorendorff's idea定義一個64位數字的類是吸引人的。理想情況下,您希望最小化顯式類創建的數量。
使用c_longlong
,你可以做這樣的事情(注: Python 3.x都有唯一):
from ctypes import c_longlong
class ll(int):
def __new__(cls, n):
return int.__new__(cls, c_longlong(n).value)
def __add__(self, other):
return ll(super().__add__(other))
def __radd__(self, other):
return ll(other.__add__(self))
def __sub__(self, other):
return ll(super().__sub__(other))
def __rsub__(self, other):
return ll(other.__sub__(self))
...
這樣的ll(2 ** 63) - 1
結果確實會9223372036854775807
。雖然這種構造可能會導致性能損失,但取決於你想要做什麼,定義類如上所述可能不值得。如有疑問,請使用timeit
。
3
最快的東西可能是結果截斷到64位自己:
def to_int64(n):
n = n & ((1 << 64) - 1)
if n > (1 << 63) - 1:
n -= 1 << 64
return n
當然你也可以定義自己的數字類型這一點,你做任何形式的算術運算的每一次自動完成:
class Int64:
def __init__(self, n):
if isinstance(n, Int64):
n = n.val
self.val = to_int64(n)
def __add__(self, other):
return Int64(self.val + other)
def __radd__(self, other):
return Int64(other + self.val)
def __sub__(self, other):
return Int64(self.val - other)
...
但這並不是特別「快速」實施。
1
查看ctypes模塊,它用於從python調用外部DLL /庫。 那裏,C類型對應的一個一些數據類型,例如
類c_longlong
10
你能使用numpy嗎?它有一個int64類型,完全符合你的要求。
In [1]: import numpy
In [2]: numpy.int64(2**63-1)
Out[2]: 9223372036854775807
In [3]: numpy.int64(2**63-1)+1
Out[3]: -9223372036854775808
這是對用戶透明,不像ctypes的例子,它在C語言編寫的,因此會比在Python滾動自己的類更快。 Numpy可能比其他解決方案更大,但如果您正在進行數值分析,您會欣賞它。
相關問題
- 1. 無符號長long int類型戰俘
- 2. tgamma()long long類型轉換
- 3. C++`long long`變量類型
- 4. 「unsigned long int類型」和「無符號長long int型的收入分配問題
- 5. 'long long long'對於GCC來說太長使用log4cpp
- 6. 後綴LL爲long long類型
- 7. 什麼是Java類型long long
- 8. cpp:eclipse不識別'long long'類型
- 9. 類型「long long」總是64位?
- 10. 類型轉換爲無符號long long?
- 11. 聯盟爲unsigned long long int類型投
- 12. 爲什麼數據類型長期支持等於long long的最大數量?
- 13. 型長Vs的類型長整型
- 14. 存儲一個比在Java中long類型長的數字
- 15. C++ unsigned long類型和<
- 16. 主鍵類型:int vs long
- 17. C++ Casting類型(SLODWORD和long)
- 18. 錯誤類型長
- 19. 警告:整型常量對於「long」類型來說太大
- 20. 格式指定類型'無符號long long',但參數的類型爲'unsigned int'
- 21. 錯誤:類型「長*」不能分配給類型的實體「長」
- 22. 一個奇怪的C++錯誤,也許它是相對於long long類型
- 23. 使用long long型打印
- 24. Python類型系統 - 對象與類型
- 25. 將地圖[長,設置[長])映射到地圖[Long,Long]
- 26. 長長爲int和int爲long long轉換
- 27. Long long type defintion
- 28. Python長整型輸入
- 29. Python:「不支持的操作數類型爲+:'long'和'numpy.float64'」
- 30. 雙類型到長類型