Повышение скорости при работе с большими числами и большими массивами в Python - PullRequest
0 голосов
/ 21 марта 2020

У меня есть задача:

Сколько пар (i, j): array_1 [i] + array_1 [j]> array_2 [i] + array_2 [j]

This мой код:

import  numpy as np 
import  pandas as pd

n = 200000

series_1 = np.random.randint(low = 1,high = 1000,size = n)
series_1_T = series_1.reshape(n,1)
series_2  = np.random.randint(low = 1,high = 1000,size = n)
series_2_T = series_2.reshape(n,1)

def differ(x):
    count = 0
    tabel_1 = series_1 + series_1_T[x:x+2000]
    tabel_2 = series_2 + series_2_T[x:x+2000]
    diff= tabel_1[tabel_1>tabel_2].shape[0]
    count += diff
    return count

arr = pd.DataFrame(data = np.arange(0,n,2000),columns = ["numbers"])

count_each_run = arr["numbers"].apply(differ) #this one take about 8min 40s

print(count_each_run.sum())

Есть ли способы ускорить это?

1 Ответ

1 голос
/ 21 марта 2020

Если вы не запускаете ошибку памяти, вы можете сделать:

n = 200_000

s1 = np.random.randint(low=1, high=1000, size=(n,1))
s2 = np.random.randint(low=1, high=1000, size=(n,1))

t1 = s1 + s1.T
t2 = s2 + s2.T

tot = np.sum(t1>t2)

В противном случае вы можете создавать пакеты, и снова, в зависимости от того, что вы можете поместить в память, вы можете использовать один или два для циклов:

n = 200_000

s1 = np.random.randint(low=1, high=1000, size=(n,1))
s2 = np.random.randint(low=1, high=1000, size=(n,1))

bs = 10_000 # batchsize
tot = 0
for i in range(0, n, bs):
    for j in range(0, n, bs):

        t1 = s1[i:i+bs] + s1[j:j+bs].T
        t2 = s2[i:i+bs] + s2[j:j+bs].T

        tot += np.sum(t1>t2)

Если вам нужна скорость, вы можете попробовать что-то вроде numba или cython.

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