Факторизация среднего Numpy Интс создает предупреждение времени выполнения - PullRequest
1 голос
/ 22 января 2020

Я проверяю время выполнения на факториалах (приходится использовать пользовательскую функцию), но получаю странную ошибку. Код, с которым я работаю, выглядит следующим образом:

import numpy as np
import time
np.random.seed(14)
nums = list(np.random.randint(low=100, high=500, size=10))
# nums returns as [207, 444, 368, 427, 349, 458, 334, 256, 238, 308]
def fact(x):
  if x == 1:
    return 1
  else:
    return x * fact(x-1)
recursion_times = []
recursion_factorials = []

for i in nums:
    t1 = time.perf_counter()
    factorial = fact(i)
    t2 = time.perf_counter()
    execution = t2-t1
    recursion_factorials.append(factorial)
    recursion_times.append(execution)
    print(execution)

Когда я запускаю вышеописанное, я получаю следующее: RuntimeWarning: overflow encountered in long_scalars"""

Но когда я запускаю его, как показано ниже, Я не получаю предупреждений.

recursion_times = []
recursion_factorials = []
for i in [207, 444, 368, 427, 349, 458, 334, 256, 238, 308]:
    t1 = time.perf_counter()
    factorial = fact(i)
    t2 = time.perf_counter()
    execution = t2-t1
    recursion_factorials.append(factorial)
    recursion_times.append(execution)
    print(execution)

Я знаю, что вызов списка nums требует дополнительных затрат, но почему это вызовет предупреждение во время выполнения? Я пытался копаться, но я получаю только динамически именуемые переменные потоки и библиотеки подавления предупреждений - я ищу, почему это может произойти.

Для чего я стою, я запускаю Python3 в ноутбук Юпитера. Рад ответить на любые другие вопросы, если это поможет.

Заранее спасибо за помощь!

1 Ответ

3 голосов
/ 22 января 2020

Если (как в текущей версии вашего сообщения) вы создали nums, вызвав list для массива NumPy, но записали явный литерал списка без NumPy для второго теста, тогда второй Тест не выдает предупреждение, потому что он не использует NumPy. nums - это список NumPy целых чисел фиксированной ширины, тогда как другой список - это список обычных Python целых. Обычные значения Python не переполняются.

(Если вы хотите создать список обычных Python скаляров из массива NumPy, способ сделать это с помощью array.tolist(). Это обычно нежелательно из-за проблем с производительностью, но иногда необходимо взаимодействовать с кодом, который задыхается на NumPy типах.)


Обычно будет дополнительный эффект из-за обработки предупреждений Python по умолчанию , По умолчанию Python выдает предупреждение только один раз для местоположения кода на Python процесс. В исходной версии вашего вопроса это выглядело так, как будто это и было причиной различий.


Использование переменной или ее отсутствие не влияет на это предупреждение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...