Какие-либо преимущества в импорте субмодулей напрямую (кажется, медленнее)? - PullRequest
0 голосов
/ 28 июня 2019

Я хотел посмотреть, что быстрее:

import numpy as np
np.sqrt(4)

-или-

from numpy import sqrt
sqrt(4)

Вот код, который я использовал, чтобы найти среднее время выполнения каждого.

def main():
   import gen_funs as gf
   from time import perf_counter_ns
   t = 0
   N = 40
   for j in range(N):
      tic = perf_counter_ns()
      for i in range(100000):
         imp2()  # I ran the code with this then with imp1()

      toc = perf_counter_ns()
      t += (toc - tic)
   t /= N
   time = gf.ns2hms(t) # Converts ns to readable object
   print("Ave. time to run: {:d}h {:d}m {:d}s {:d}ms" .
        format(time.hours, time.minutes, time.seconds, time.milliseconds))

def imp1():
   import numpy as np
   np.sqrt(4)
   return

def imp2():
   from numpy import sqrt
   sqrt(4)
   return

if __name__ == "__main__":
   main()

Когда я import numpy as np затем звоню np.sqrt(4), я получаю среднее время около 229 мс (время запуска цикла 10 ** 4 раза).

Когда я запускаю from numpy import sqrt, а затем звоню sqrt(4), я получаю среднее время, равное 332 мс .

Поскольку существует такая разница во времени, польза от запуска from numpy import sqrt? Есть ли польза от памяти или какая-то другая причина, по которой я бы это сделал?

1 Ответ

0 голосов
/ 28 июня 2019

Я попытался определить время с помощью команды time bash. Я получил 215ms для импорта numpy и запуска sqrt(4) и 193ms для импорта sqrt из numpy с помощью той же команды. Честно говоря, разница незначительна.

Однако, если вам не нужен определенный аспект модуля, его импорт не рекомендуется.

В данном конкретном случае, поскольку заметного выигрыша в производительности нет, и есть несколько ситуаций, в которых вы могли бы импортировать только numpy.sqrt (math.sqrt в ~ 4 раза быстрее. Дополнительные функции numpy.sqrt предложения будут доступны только для использования если у вас есть numpy данные, что, конечно, потребует от вас импорта всего модуля).

Может быть редкий сценарий, в котором вам не нужны все numpy, но все еще нужны numpy.sqrt, например. используя pandas.DataFrame.to_numpy() и каким-то образом манипулируя данными, но, честно говоря, я не чувствую, что скорость в 20 мс ничего не стоит в реальном мире. Тем более, что вы видели худшую производительность при импорте всего numpy.sqrt.

...