Неожиданным 32-битное целочисленное переполнение в панды/numpy строки типа int64 (питон 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 ОС и все отчеты 64-битные (напр.python --version, sys.maxsize, plastform.architecture).

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

1 9

1 ответ:

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

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