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 rozmowie sortedmatch(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
- Funkcja wewnętrzna sortmatch () została usunięta i zastąpiona przez chmatch () podczas dopasowywania i poziomów do x poziomów dla kolumn typu „współczynnik”. Ten wstępny krok powodował (znane) znaczące spowolnienie, gdy liczba poziomów kolumny czynnika była duża (np.> 10 000). Zaostrzył się w testach łączenia czterech takich kolumn, co wykazał Wes McKinney (autor pakietu Python Pandas). Dopasowanie 1 miliona ciągów, z których 600 000 jest unikalnych, zostało na przykład skrócone z 16 do 0,5 sekundy.
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:
data.table
ma na myśli scalanie szeregów czasowych . 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.
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.
data.table
po prostu dziedziczy podata.frame
, ale opiera się na kodzie C pod maską.