Прочитайте до конца, чтобы увидеть, как NumPy может превзойти ваш Java-код в 5 раз.
numpy
Сила заключается в векторизованных вычислениях. Ваш код Python основан на интерпретируемых циклах, а интерпретируемые циклы, как правило, работают медленно.
Я переписал ваш код Python как векторизованное вычисление, и это сразу ускорило его в ~ 16 раз:
In [41]: v = np.arange(5000)
In [42]: %timeit np.outer(v, v) % 10
1 loop, best of 3: 544 ms per loop
Вычисление % 10
вместо создания нового массива ускоряет работу еще на 20%:
In [37]: def f(n):
...: v = np.arange(n)
...: a = np.outer(v, v)
...: a %= 10
...: return a
...:
In [39]: %timeit f(5000)
1 loop, best of 3: 437 ms per loop
edit 1: Выполнение вычислений в 32 битах вместо 64(чтобы соответствовать вашему коду Java) в основном соответствует производительности Java - h / t @ user2357112 для указания на это:
In [50]: def f(n):
...: v = np.arange(n, dtype=np.int32)
...: a = np.outer(v, v)
...: a %= 10
...: return a
...:
In [51]: %timeit f(5000)
10 loops, best of 3: 126 ms per loop
edit 2: И с небольшой работоймы можем сделать этот код примерно в 5 раз быстрее, чем ваша реализация Java (здесь ne
относится к numexpr
module ):
In [69]: v = np.arange(5000, dtype=np.int32)
In [70]: vt = v[np.newaxis].T
In [71]: %timeit ne.evaluate('v * vt % 10')
10 loops, best of 3: 25.3 ms per loop
edit 3: Пожалуйста, не забудьте также взглянуть на ответ , данный @ max9111 .