Неожиданное переполнение 32-разрядного целого числа в pandas / numpy int64 (python 3.6)

позвольте мне начать с примера кода:

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 OS и все отчеты 64-бит (например,python --version, sys.maxsize, plastform.architecture).

что может быть причиной этого?

1 ответов


Это ошибка в блоке bottleneck библиотека, которую панды используют, если она установлена. В некоторых случаях,bottleneck.nansum неправильно имеет 32-битное переполнение при вызове 64-битного ввода.

Я считаю, что это из-за bottleneck используя PyInt_FromLong, даже если long 32-битные. Я не уверен, почему это вообще компилируется. Есть отчет о проблеме на узкое место проблема tracker, еще не исправлено, а также отчет о проблеме на вопрос панды следопыт!--9-->, где они пытались компенсировать проблему узкого места (но я думаю, что они отключили узкое место, когда оно работает, а не когда оно не работает).