Сравнение времени numpy argmax и функций сортировки - PullRequest
1 голос
/ 29 апреля 2019

Я пытаюсь найти столбец с максимальной суммой столбцов 2D-матрицы в numpy. Например:

Пусть A = [[1, 2, 3], [0, 1, 4], [0, 0, 1]]

Суммы каждого столбца: [1, 3, 8]. Таким образом, 3-й столбец имеет максимальную сумму столбца.

При попытке использовать функции numpy.argmax и numpy.sort для выполнения этой задачи, Я ожидал, что argmax будет в идеале быстрее, чем сортировка, но они привели к тому же времени выполнения .

a = np.random.rand(7000, 8000)
start_time = time.time()
for i in range(1000):
    np.sort(np.sum(a, axis = 0))
print(time.time() - start_time)

Указанный выше код выполняется за 33,29 секунды, а приведенный ниже - также за 34,33 секунды.

a = np.random.rand(7000, 8000)
start_time = time.time()
for i in range(1000):
    np.argmax(np.sum(a, axis=0))
print(time.time() - start_time)

Не могли бы вы сообщить мне возможные причины этого? Это связано с тем, как я решаю проблему?

1 Ответ

1 голос
/ 29 апреля 2019

Время с модулем timeit.

>>> from timeit import Timer
>>> import numpy as np
>>> a = np.random.random((7000,8000))
>>> loops = 3
>>> timer = Timer("np.sum(a, axis=0)", "from __main__ import a, np")
>>> timer.timeit(loops) / loops
0.10155341827648574
>>> timer = Timer("np.argmax(a)", "from __main__ import a, np")
>>> timer.timeit(loops) / loops
0.11956859843814982
>>> timer = Timer("np.sort(a)", "from __main__ import a, np")
>>> timer.timeit(loops) / loops
3.5973468146321466
>>> timer = Timer("np.sort(np.sum(a, axis=0))", "from __main__ import a, np")
>>> timer.timeit(loops) / loops
0.09826639265653132
>>> timer = Timer("np.argmax(np.sum(a, axis=0))", "from __main__ import a, np")
>>> timer.timeit(loops) / loops
0.09442937388683958
>>> 
...