сопоставляется с массивом numpy, почему все время занимает больше времени? - PullRequest
1 голос
/ 23 января 2020

Я пытаюсь оптимизировать все oop на python. Я пытаюсь сделать это с помощью функции карты, как вы можете видеть в следующем коде:

a=np.arange(5000)
z=map(lambda x: a[x]-1,range(5000))
j=np.array(list(z))

когда я беру время кода, используя %% timeit в начале кода, оно показывает мне это число:

4.91 ms ± 71.3 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

Теперь, когда я беру время каждой строки, я получаю следующий вывод:

6.66 µs ± 126 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
816 ns ± 5.11 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)
1.34 ms ± 9.38 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

Почему общее время отличается?

1 Ответ

0 голосов
/ 31 января 2020

Когда вы пытаетесь измерить время каждой строки в отдельности, map объект возвращает пустой итератор после первой оценки. Таким образом, j=np.array(list(z)) создает массив, который, как вы предполагали, был создан непосредственно во время первого выполнения, а затем создает пустые массивы. Используя cProfile , вы можете увидеть, сколько раз lambda был вызван:

import cProfile

a=np.arange(5000)
z=map(lambda x: a[x]-1,range(5000))

def f3():
    j=np.array(list(z))


cProfile.run('f3()')
         5005 function calls in 0.004 seconds

   Ordered by: standard name

   ncalls  tottime  percall  cumtime  percall filename:lineno(function)
     5000    0.003    0.000    0.003    0.000 <ipython-input-62-2cd7b69aa97e>:2(<lambda>)
        1    0.001    0.001    0.004    0.004 <ipython-input-63-17354a2581c6>:1(f3)
        1    0.000    0.000    0.004    0.004 <string>:1(<module>)
        1    0.000    0.000    0.004    0.004 {built-in method builtins.exec}
        1    0.001    0.001    0.001    0.001 {built-in method numpy.array}
        1    0.000    0.000    0.000    0.000 {method 'disable' of '_lsprof.Profiler' objects}



cProfile.run('f3()')
         5 function calls in 0.000 seconds

   Ordered by: standard name

   ncalls  tottime  percall  cumtime  percall filename:lineno(function)
        1    0.000    0.000    0.000    0.000 <ipython-input-63-17354a2581c6>:1(f3)
        1    0.000    0.000    0.000    0.000 <string>:1(<module>)
        1    0.000    0.000    0.000    0.000 {built-in method builtins.exec}
        1    0.000    0.000    0.000    0.000 {built-in method numpy.array}
        1    0.000    0.000    0.000    0.000 {method 'disable' of '_lsprof.Profiler' objects}
...