A map()
решение на основе list
:
ll = list(map(int, map(my_genre.__contains__, list_of_genres)))
print(ll)
# [0, 0, 0, 0, 0, 1, 0, 1, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0]
Для результата numpy.ndarray()
вы можете использовать np.fromiter()
:
import numpy as np
arr = np.fromiter(map(my_genre.__contains__, list_of_genres), dtype=int)
print(arr)
# [0 0 0 0 0 1 0 1 1 0 1 0 0 0 0 0 0 0 0]
Для больших входов np.in()
должно быть самым быстрым. Для входов такого размера подход map()
работает в ~ 6 раз быстрее, чем np.isin()
, в ~ 65 раз быстрее, чем решение pandas
, и на ~ 40% быстрее, чем понимание.
%timeit np.isin(list_of_genres, my_genre).astype(int)
# 15.8 µs ± 385 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
%timeit np.fromiter(map(my_genre.__contains__, list_of_genres), dtype=int)
# 2.55 µs ± 27.7 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
%timeit np.fromiter((my_genre.__contains__(x) for x in list_of_genres), dtype=int)
# 4.14 µs ± 19.7 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
%timeit df["genres"].isin(my_genre).astype(int)
# 167 µs ± 2.26 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)
Это может быть еще больше ускорено путем преобразования my_genre
в set
до применения оператора in
/ .__contains__
:
%timeit np.fromiter(map(set(my_genre).__contains__, list_of_genres), dtype=int)
# 1.9 µs ± 7.17 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)