Niedawno natknąłem się na bibliotekę pand dla Pythona, która według tego testu porównawczego wykonuje bardzo szybkie połączenia w pamięci. Jest nawet szybszy niż pakiet data.table w R (mój język do analizy).
Dlaczego jest pandas
o wiele szybszy niż data.table
? Czy to z powodu nieodłącznej przewagi szybkości, jaką Python ma nad R, czy też jest jakiś kompromis, którego nie jestem świadomy? Czy istnieje sposób na wykonanie połączeń wewnętrznych i zewnętrznych data.table
bez uciekania się do merge(X, Y, all=FALSE)
i merge(X, Y, all=TRUE)
?
Oto kod R i kod Pythona używane do testów porównawczych różnych pakietów.
data.table
po prostu dziedziczy podata.frame
, ale opiera się na kodzie C pod maską.set()
dodano dodata.table
wkrótce po tej dyskusji. Bardzo podobny do,:=
ale unika niewielkiego narzutu,[.data.table
gdy jest zapętlony, a zatem jest tak szybki, jakmatrix
. Dlategodata.frame
można nim manipulować równie szybko jak matrycą. Benchmark jest tutaj .Odpowiedzi:
Wygląda na to, że Wes mógł odkryć znany problem,
data.table
gdy liczba unikalnych ciągów ( poziomów ) jest duża: 10 000.Czy
Rprof()
ujawnia większość czasu spędzonego na rozmowiesortedmatch(levels(i[[lc]]), levels(x[[rc]])
? To nie jest tak naprawdę samo łączenie (algorytm), ale wstępny krok.Ostatnio podjęto wysiłki, aby zezwolić na kolumny znaków w kluczach, co powinno rozwiązać ten problem poprzez ściślejszą integrację z własną globalną tabelą skrótów ciągów R. Niektóre wyniki testów porównawczych są już zgłaszane przez,
test.data.table()
ale ten kod nie jest jeszcze podłączony, aby zastąpić poziomy pasującymi poziomami.Czy pandy łączą się szybciej niż w
data.table
przypadku zwykłych kolumn całkowitych? Powinien to być sposób na oddzielenie samego algorytmu od problemów czynnikowych.Również
data.table
ma szeregów czasowych seryjnej w umyśle. Dwa aspekty tego: i) klucze uporządkowane w wielu kolumnach , takie jak (id, datetime) ii) szybkie łączenie dominujące (roll=TRUE
), czyli ostatnia obserwacja przeniesiona do przodu.Potrzebuję trochę czasu, aby potwierdzić, ponieważ jest to pierwsze, jakie widziałem w porównaniu do
data.table
prezentowanego.AKTUALIZACJA z data.table v1.8.0 wydana w lipcu 2012 r
także w tym wydaniu było:
kolumny znakowe są teraz dozwolone w kluczach i są preferowane do uwzględnienia. data.table () i setkey () nie wymuszają już znaku na czynnik. Czynniki są nadal obsługiwane. Wdraża FR # 1493, FR # 1224 i (częściowo) FR # 951.
Nowe funkcje chmatch () i% chin%, szybsze wersje match () i% in% dla wektorów znaków. Wykorzystywana jest wewnętrzna pamięć podręczna ciągów R (nie jest budowana żadna tablica skrótów). Są około 4 razy szybsze niż funkcja match () na przykładzie w? Chmatch.
Od września 2013 data.table jest w wersji 1.8.10 na CRAN i pracujemy nad wersją 1.9.0. AKTUALNOŚCI są aktualizowane na żywo.
Ale jak napisałem pierwotnie, powyżej:
Zatem łączenie Pandas equi dwóch kolumn znakowych jest prawdopodobnie nadal szybsze niż data.table. Ponieważ wygląda na to, że haszuje połączone dwie kolumny. data.table nie haszuje klucza, ponieważ ma na myśli dominujące uporządkowane łączenia. „Klucz” w data.table jest dosłownie po prostu porządkiem sortowania (podobnie jak indeks klastrowy w SQL; tj. Tak są uporządkowane dane w pamięci RAM). Na liście można na przykład dodać klucze dodatkowe.
Podsumowując, rażąca różnica prędkości podkreślona przez ten szczególny test dwukolumnowy z ponad 10000 unikalnych ciągów nie powinna być teraz tak zła, ponieważ znany problem został naprawiony.
źródło
Powodem, dla którego pandy są szybsze, jest to, że wymyśliłem lepszy algorytm, który jest zaimplementowany bardzo ostrożnie przy użyciu szybkiej implementacji tablicy mieszania - klib i C / Cython, aby uniknąć obciążenia interpretera Pythona dla części, których nie można wektoryzować. Algorytm został szczegółowo opisany w mojej prezentacji: Spojrzenie na projekt i rozwój pand .
Porównanie z
data.table
jest właściwie trochę interesujące, ponieważ cały punkt Rdata.table
polega na tym, że zawiera wstępnie obliczone indeksy dla różnych kolumn, aby przyspieszyć operacje, takie jak wybór i scalanie danych. W tym przypadku (łączenie się z bazą danych) DataFrame pand nie zawiera wstępnie obliczonych informacji, które są używane do scalania, więc tak powiem, jest to scalanie „na zimno”. Gdybym przechowywał rozłożone na czynniki wersje kluczy łączenia, łączenie byłoby znacznie szybsze - ponieważ faktoryzacja jest największym wąskim gardłem dla tego algorytmu.Powinienem również dodać, że wewnętrzny projekt DataFrame pand jest znacznie bardziej podatny na tego rodzaju operacje niż data.frame R. (która jest tylko wewnętrzną listą tablic).
źródło
data.table
były głównie spowodowane błędem, który został już naprawiony. Jest jakaś szansa, że mógłbyś ponownie uruchomić swój test porównawczy i napisać zaktualizowany post na blogu?Ten temat ma dwa lata, ale wydaje się, że jest to prawdopodobne miejsce, w którym ludzie mogą wylądować, gdy szukają porównań pand i danych. Tabela
Ponieważ oba z nich ewoluowały w czasie, chcę opublikować tutaj stosunkowo nowsze porównanie (z 2014 r.) Dla zainteresowanych użytkowników: https://github.com/Rdatatable/data.table/wiki/Benchmarks-:-Grouping
Byłoby interesujące wiedzieć, czy Wes i / lub Matt (którzy, nawiasem mówiąc, są twórcami odpowiednio Pand i data.table i obaj skomentowali powyżej) również mają tutaj jakieś nowości do dodania.
-- AKTUALIZACJA --
Komentarz zamieszczony poniżej przez jangoreckiego zawiera link, który moim zdaniem jest bardzo przydatny: https://github.com/szilard/benchm-databases
Ten wykres przedstawia średnie czasy operacji agregacji i łączenia dla różnych technologii ( niższy = szybszy ; ostatnio zaktualizowano porównanie we wrześniu 2016 r.). To było dla mnie naprawdę pouczające.
Wracając do pytania
R DT key
iR DT
odwołując się do typów keyed / unkeyed R's data.table, okazuje się, że jest szybszy w tym teście porównawczym niż Pandas (Py pandas
) w Pythonie .źródło
Istnieją świetne odpowiedzi, zwłaszcza autorstwa autorów obu narzędzi, o które pyta się pytanie. Odpowiedź Matta wyjaśnia przypadek zgłoszony w pytaniu, że był on spowodowany błędem, a nie algorytmem scalania. Błąd został naprawiony następnego dnia, już ponad 7 lat temu.
W mojej odpowiedzi podam aktualne terminy operacji scalania danych.table i pand. Należy pamiętać, że scalanie plyr i podstawowego R nie jest uwzględnione.
Czasy, które prezentuję, pochodzą z projektu db-benchmark , ciągle działającego, odtwarzalnego benchmarku. Uaktualnia narzędzia do najnowszych wersji i ponownie uruchamia skrypty testowe. Obsługuje wiele innych rozwiązań programowych. Jeśli interesuje Cię Spark, Dask i kilka innych, koniecznie sprawdź link.
W tej chwili ... (nadal w realizacji: jeszcze jeden rozmiar danych i 5 dodatkowych pytań)
Testujemy 2 różne rozmiary danych tabeli LHS.
Dla każdego z tych rozmiarów danych uruchamiamy 5 różnych pytań scalających.
Stół RHS ma 3 różne rozmiary
We wszystkich przypadkach istnieje około 90% pasujących wierszy między LHS i RHS i nie ma duplikatów w kolumnie łączącej RHS (brak produktu kartezjańskiego).
Od teraz (uruchomiony 2 listopada 2019)
pandy 0.25.3 wydane 1 listopada 2019 r
tabela 0.12.7 (92abb70) wydane 2 listopada 2019 r.
Poniższe czasy są w sekundach, dla dwóch różnych rozmiarów danych LHS. Do kolumny
pd2dt
dodaje się współczynnik przechowywania pola określający, ile razy pandy są wolniejsze niż data.table.źródło