【发布时间】:2017-09-17 10:33:37
【问题描述】:
让我从示例代码开始:
import numpy
from pandas import DataFrame
a = DataFrame({"nums": [2233, -23160, -43608]})
a.nums = numpy.int64(a.nums)
print(a.nums ** 2)
print((a.nums ** 2).sum())
在我的本地机器和其他开发者的机器上,这可以按预期工作并打印出来:
0 4986289
1 536385600
2 1901657664
Name: nums, dtype: int64
2443029553
但是,在我们的生产服务器上,我们得到:
0 4986289
1 536385600
2 1901657664
Name: nums, dtype: int64
-1851937743
这是 32 位整数溢出,尽管它是 int64。
生产服务器使用相同版本的 python、numpy、pandas 等。它是 64-bit Windows Server 2012 操作系统,所有内容都报告 64 位(例如 python --version、sys.maxsize、plastform.architecture)。
这可能是什么原因造成的?
【问题讨论】:
-
为什么不使用能够表示任意大数字的常规 Python 整数?
-
@ForceBru:如果您尝试使用充满整数对象的对象数组,它们会很慢、很笨重并且会导致奇怪的损坏。
-
其中一台机器是否安装了
bottleneck? -
print((a.nums.values**2).sum(dtype=np.int64))的输出是什么? -
@SeanKramer:我刚刚开始挖掘代码并最终陷入瓶颈。我认为瓶颈是在 C long 为 32 位的平台上对
numpy.int64处理不当,而 Pandas 在尝试补偿瓶颈错误时检查错误。
标签: python python-3.x pandas numpy integer-overflow