Почему random.choices быстрее, чем случайный выбор NumPy? - PullRequest
1 голос
/ 11 марта 2020

Я пытаюсь сделать случайную выборку наиболее эффективным способом в Python, однако я озадачен, потому что при использовании random.choices () numpy было медленнее, чем при использовании random.choices ()

import numpy as np
import random

np.random.seed(12345)

# use gamma distribution
shape, scale = 2.0, 2.0 
s = np.random.gamma(shape, scale, 1000000)
meansample = []

samplesize = 500

%timeit meansample = [ np.mean( np.random.choice( s, samplesize, replace=False)) for _ in range(500)]
23.3 s ± 229 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

%timeit meansample = [np.mean(random.choices(s, k=samplesize)) for x in range(0,500)]
152 ms ± 324 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)

23 секунды против 152 мс - это много времени

Что я делаю не так?

1 Ответ

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

Два вопроса здесь. Во-первых, для библиотеки pure- Python random вы, вероятно, хотите использовать sample вместо choices для выборки без замены. Это несколько меняет ориентир. Во-вторых, np.random.choice имеет более эффективные альтернативы для отбора проб без замены. Это известная проблема , связанная со случайным генератором API. Вы можете использовать np.random.Generator для повышения производительности. Мое время:

%timeit meansample = [ np.mean( np.random.choice( s, samplesize, replace=False)) for _ in range(500)]
# 1 loop, best of 3: 12.4 s per loop

%timeit meansample = [np.mean(random.choices(s, k=samplesize)) for x in range(0,500)]
# 10 loops, best of 3: 118 ms per loop

sl = s.tolist()
%timeit meansample = [np.mean(random.sample(sl, k=samplesize)) for x in range(0,500)]
# 1 loop, best of 3: 219 ms per loop

g = np.random.Generator(np.random.PCG64())
%timeit meansample = [ np.mean( g.choice( s, samplesize, replace=False)) for _ in range(500)]
# 10 loops, best of 3: 25 ms per loop

Итак, без замены random.sample превосходит np.random.choice, но медленнее, чем np.random.Generator.choice.

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