Pandalar neden python'da birleştirilirken verilerden daha hızlıydı.


160

Son zamanlarda bu kıyaslama göre çok hızlı bellek içi birleştirme yapan python için panda kütüphanesine rastladım . R'deki data.table paketinden bile daha hızlı (analiz için tercih ettiğim dil).

Neden pandasbu kadar hızlı data.table? Python'un R üzerinde sahip olduğu doğal bir hız avantajı mı, yoksa farkında olmadığım bazı takaslar var mı? İç ve dış katılır gerçekleştirmek için bir yolu var mı data.tablebaşvurmadan merge(X, Y, all=FALSE)ve merge(X, Y, all=TRUE)?

karşılaştırma

İşte R kodu ve Python kodu çeşitli paketler kriter kullanılır.


10
@JoshuaUlrich: IIRC data.tablesadece miras alır data.frame, ancak kaputun altındaki C koduna dayanır.
digEmTüm

4
@Joshua "data.frames C de manipüle etseniz bile yavaştır" derken neyi kastediyorsunuz? Bu başka bir şeye göre mi? Peki ya yavaş?
Matt Dowle

12
@JoshuaUlrich Bu yorumu izlemenin hiç yatmadığını fark ettim. Temizlemek için: Bu tartışmadan hemen sonra set()eklendi data.table. Çok benzer :=ancak [.data.tableilmeklediğinde küçük ek yükü önler ve sonuç olarak hızlıdır matrix. Bu nedenle, data.frame olabilir sadece matris olarak perhizden olarak manipüle edilebilir. Kıyaslama burada .
Matt Dowle

5
Bu kriterin güncellenmiş bir versiyonunu alabilir miyiz, bu bankın aslında bir uç durum olduğu ve bunun şimdiye kadar düzeltildiği oldukça açık. Gördüğüm tüm kriterler data.table'ın daha hızlı olduğunu gösterdiğinden, birleştirme numarasının ne olduğunu görmek ister miyim?
geçerli

3
@statquant Orijinal karşılaştırmayı çalıştırmadım, ama Wes'in karşılaştırmalı değerlendirmeyi gerçekten görmek isterim.
Zach

Yanıtlar:


120

Görünüşe göre Wes data.table, benzersiz dize ( düzey ) sayısı büyük olduğunda bilinen bir sorunu keşfetmiş olabilir : 10,000.

Rprof()Çağrıda harcanan zamanın çoğunu ortaya çıkarıyor mu sortedmatch(levels(i[[lc]]), levels(x[[rc]])? Bu gerçekten birleştirmenin kendisi (algoritma) değil, bir ön adım.

Son çabalar, anahtarların karakter sütunlarına izin vermeye başladı ve bu da R'nin kendi global dize karma tablosuyla daha yakından bütünleşerek bu sorunu çözmeli. Bazı kıyaslama sonuçları zaten tarafından rapor edilmiştir, test.data.table()ancak seviyeler eşleşen seviyelere geçmek için bu kod henüz bağlanmamıştır.

Pandalar birleştirme data.tablenormal tamsayı sütunlarına göre daha mı hızlı ? Bu, algoritmanın kendisini faktör sorunlarına karşı izole etmenin bir yolu olmalıdır.

Ayrıca, data.tablesahip zaman serisi birleştirme aklında. Bunun iki yönü: i) (id, datetime) gibi çok sütunlu sıralı anahtarlar ii) hızlı devam eden birleştirme ( roll=TRUE), yani son gözlem.

data.tableSunulan karşılaştırmayı ilk gördüğüm için onaylamak için biraz zamana ihtiyacım olacak .


Temmuz 2012'de yayınlanan data.table v1.8.0 sürümünden GÜNCELLEME

  • İç işlev sortmatch () kaldırıldı ve 'düzey' türündeki sütunlar için i düzeylerini x düzeyleriyle eşleştirirken chmatch () ile değiştirildi. Bu ön adım, bir faktör sütununun seviyesi büyük olduğunda (örneğin> 10.000) (bilinen) önemli bir yavaşlamaya neden oluyordu. Wes McKinney (Python paket Pandas'ın yazarı) tarafından gösterildiği gibi, bu tür dört sütuna katılma testlerinde şiddetlendi. Örneğin, 600.000'i benzersiz olan 1 milyon dizeyi eşleştirmek artık 16 saniyeden 0,5 saniyeye düşürüldü.

ayrıca bu sürümde:

  • karakter sütunlarına artık anahtarlarda izin veriliyor ve çarpanlara tercih ediliyor. data.table () ve setkey () artık karakteri faktöre zorlamaz. Faktörler hala desteklenmektedir. FR # 1493, FR # 1224 ve (kısmen) FR # 951'i uygular.

  • Yeni fonksiyonlar chmatch () ve% chin%, daha hızlı eşleşme () sürümleri ve% vektörleri için karakter vektörleri. R'nin dahili dize önbelleği kullanılır (karma tablosu oluşturulmaz). ? Chmatch örneğindeki match () yönteminden yaklaşık 4 kat daha hızlıdırlar.

Eylül 2013 itibariyle data.table, CRAN üzerinde v1.8.10 ve v1.9.0 üzerinde çalışıyoruz. HABER canlı olarak güncellenir.


Ama aslen yazdığım gibi, yukarıda:

data.tablesahiptir zaman serileri birleştirme aklında. Bunun iki yönü: i) (id, datetime) gibi çok sütunlu sıralı anahtarlar ii) hızlı devam eden birleştirme ( roll=TRUE), yani son gözlem.

Bu nedenle, Pandalar equi iki karakter sütununun birleşimi muhtemelen verilerden daha hızlıdır. Kulağa kombine iki sütun hash gibi görünüyor. data.table, anahtarda hash vermez, çünkü geçerli siparişleri akılda tutar. Data.table içindeki bir "anahtar", kelimenin tam anlamıyla sadece sıralama düzenidir (SQL'deki kümelenmiş bir dizine benzer; yani, veri RAM'de bu şekilde sıralanır). Listede, örneğin ikincil anahtarlar eklenecektir.

Özetle, 10.000'den fazla benzersiz dizeyle bu özel iki karakterli sütun testi ile vurgulanan göze çarpan hız farkı, bilinen sorun düzeltildiğinden, şimdi o kadar kötü olmamalıdır.


6
Oldukça büyük, gerçekçi bir veri kümesi için bir test durumu sağlarsanız, karşılaştırmaları çalıştırmaktan memnuniyet duyarız. Siz de hoş geldiniz. Aslında henüz tam sayı birleştirme anahtar dava için kod optimize değil (yapılacaklar listeme koy!), Ancak bağlantılı sunum karma tablo çalışma verilen dize durumda daha önemli bir performans bekleyebilirsiniz.
Wes McKinney

22
Bu kütüphanelerden hiçbirini kullanmıyorum ama R tarafından Matthew Dowle şeklinde yapıcı bir cevap görmekten memnunum.
SlowLearner

3
İşte bazı Rprof sonuçları pastie.org/3258362 . Birleştirme türüne bağlı olarak zamanın% 20-40'ının sıralanmış eşleşmede geçtiği anlaşılıyor. Başka bir zaman tamsayı sütunlarına bakmak zorunda kalacak
Wes McKinney

14
@AndyHayden İyileştirmeler bir süre önce yapıldı. HABERLER öğesinde düzenleme yapacağım. Wes, bilinen bu problem üzerinde oynanan belirli bir testi (iki karakter sütununu birleştirerek) seçti. Eğer tamsayı sütunları seçseydi farklı olurdu. Ve konferansta karşılaştırmayı sunmadan önce bana bir kafa vermiş olsaydı, ona bilinen sorun hakkında daha fazla bilgi verebilirdim.
Matt Dowle

191

Pandaların daha hızlı olmasının nedeni, vektörlenemeyen parçalar için Python yorumlayıcı yükünü önlemek için hızlı bir karma tablo uygulaması - klib ve C / Cython'da çok dikkatli bir şekilde uygulanan daha iyi bir algoritma bulmamdı . Algoritma sunumumda ayrıntılı olarak açıklanmıştır: Panda tasarım ve geliştirmesinin içine bir bakış .

İle karşılaştırma data.tableaslında biraz ilginç, çünkü R'lerin tüm noktası, veri seçimi ve birleştirme gibi işlemleri hızlandırmak için çeşitli sütunlar için önceden hesaplanmış dizinlerdata.table içermesidir . Bu durumda (veritabanı birleşimleri) pandaların DataFrame'i birleştirme için kullanılan önceden hesaplanmış hiçbir bilgi içermez , bu nedenle "soğuk" birleştirme olduğunu ifade eder. Ben birleştirme anahtarlarının çarpanlara ayrılmış sürümlerini saklamış olsaydım, birleştirme önemli ölçüde daha hızlı olurdu - çünkü çarpanlara ayırma bu algoritma için en büyük darboğazdır.

Pandaların DataFrame'inin iç tasarımının, R'nin data.frame'inden (bu sadece dahili olarak dizilerin bir listesi) bu tür işlemlere çok daha uygun olduğunu eklemeliyim.


76
Tabii ki, şimdi her şeyi
python'da çözdüğünüze göre

37
Ama neden kimse istesin ki? :)
ely

9
Hmm ... belki de veri işlemlerinin R'de daha hızlı olmasını istedikleri için? Just guessing :))
lebatsnok 28:13

28
Merhaba Wes-- için sonuçlarınız data.tableo zamandan beri düzeltilmiş bir hata tarafından yönlendirildi. Karşılaştırmanızı yeniden çalıştırma ve güncellenmiş bir blog yayını yazma şansınız var mı?
Zach

6
Zach bunu kontrol etmeyi
unutma

37

Bu konu iki yaşında, ancak Pandaların ve verilerin karşılaştırmasını aradıklarında insanların inmeleri için olası bir yer gibi görünüyor.

Bunların her ikisi de zamanla geliştiğinden, burada ilgilenen kullanıcılar için nispeten daha yeni bir karşılaştırma (2014'ten) göndermek istiyorum: https://github.com/Rdatatable/data.table/wiki/Benchmarks-:-Grouping

Wes ve / veya Matt'in (bu arada sırasıyla Pandalar ve data.table'ın yaratıcıları olup olmadığını ve her ikisinin de yorum yaptığını) buraya eklemek için herhangi bir haberleri olup olmadığını bilmek ilginç olacaktır.

-- GÜNCELLEME --

Aşağıda jangorecki tarafından gönderilen bir yorum çok yararlı olduğunu düşündüğüm bir bağlantı içeriyor: https://github.com/szilard/benchm-databases

https://github.com/szilard/benchm-databases/blob/master/plot.png

Bu grafik, farklı teknolojiler için ortalama toplama ve birleştirme işlemlerini göstermektedir ( daha düşük = daha hızlı ; karşılaştırma son olarak Eylül 2016'da güncellenmiştir). Benim için gerçekten eğiticiydi.

Soruya geri dönün R DT keyve R DTR'nin verilerinin anahtarlanmış / anahtarlanmamış tatlarına bakın. Tablo ve bu kriterde Python's Pandas ( Py pandas) ' dan daha hızlıdır .


1
Bunu postalamak üzereydim! Ekleme için teşekkürler.
Zach


1
@ Zach dört yıl sonra nihayet yeni kıyaslama sonuçları geldi, cevabımı aşağıya bakın.
jangorecki

7

Özellikle soru soran her iki aracın yazarları tarafından yapılan büyük cevaplar vardır. Matt'in yanıtı, bir birleştirme algoritması değil, bir hatadan kaynaklandığı sorusunda bildirilen vakayı açıklar. Hata ertesi gün, 7 yıl önce düzeltildi.

Cevabımda data.table ve pandalar için birleştirme işleminin güncel zamanlamalarını sunacağım. Plyr ve base R birleşiminin dahil olmadığını unutmayın.

Sunacağım zamanlamalar , sürekli çalışan tekrarlanabilir bir kıyaslama olan db-benchmark projesinden geliyor . Araçları son sürümlere yükseltir ve karşılaştırma komut dosyalarını yeniden çalıştırır. Diğer birçok yazılım çözümünü çalıştırır. Spark, Dask ve diğer birkaç şirket ile ilgileniyorsanız bağlantıyı kontrol ettiğinizden emin olun.


Şu an itibariyle ... (hala uygulanıyor: bir veri boyutu ve 5 soru daha)

LHS tablosunun 2 farklı veri boyutunu test ediyoruz.
Bu veri boyutlarının her biri için 5 farklı birleştirme sorusu çalıştırıyoruz.

q1: LHS iç birleşim RHS- tamsayı üzerinde küçük
q2: LHS iç birleşim RHS-tamsayı üzerinde
q3: LHS dış birleşim RHS-orta tamsayı üzerinde
q4: LHS iç birleşim RHS-orta faktör üzerinde (kategorik)
q5: LHS iç birleşim RHS- tamsayıda büyük

RHS tablosu 3 farklı boyda

  • küçük LHS / 1e6 boyutuna çevirir
  • ortam LHS / 1e3 boyutuna çevirir
  • büyük LHS boyutuna çevirir

Her durumda, LHS ve RHS arasında eşleşen satırların yaklaşık% 90'ı vardır ve RHS birleştirme sütununda kopya yoktur (kartezyen ürün yok).


Şu andan itibaren (2 Kasım 2019'da yayınlanacak)

panda 0.25.3 1 Kasım 2019 tarihinde yayınlandı.
tablo 0.12.7 (92abb70) 2 Kasım 2019'da yayınlandı

İki farklı veri boyutu LHS için aşağıdaki zamanlamalar saniye cinsindendir. Sütuna pd2dt, pandaların verilerden kaç kat daha yavaş olduğu alan depolama oranı eklenir. Tablo.

  • 0,5 GB LHS verileri
+-----------+--------------+----------+--------+
| question  |  data.table  |  pandas  |  pd2dt |
+-----------+--------------+----------+--------+
| q1        |        0.51  |    3.60  |      7 |
| q2        |        0.50  |    7.37  |     14 |
| q3        |        0.90  |    4.82  |      5 |
| q4        |        0.47  |    5.86  |     12 |
| q5        |        2.55  |   54.10  |     21 |
+-----------+--------------+----------+--------+
  • 5 GB LHS verileri
+-----------+--------------+----------+--------+
| question  |  data.table  |  pandas  |  pd2dt |
+-----------+--------------+----------+--------+
| q1        |        6.32  |    89.0  |     14 |
| q2        |        5.72  |   108.0  |     18 |
| q3        |       11.00  |    56.9  |      5 |
| q4        |        5.57  |    90.1  |     16 |
| q5        |       30.70  |   731.0  |     23 |
+-----------+--------------+----------+--------+

Gelecekten gelen güncellemeler için teşekkür ederiz! Data.table dosyasının R ve python uygulaması için bir sütun ekleyebilir misiniz?
Zach

1
Ben sadece rtt vs pandalar bakmak için, sadece web sitesine gidin ve kontrol etmek iyi olduğunu düşünüyorum. Ve pyDT gerçekten asıl sorunun bir parçası değildi.
jangorecki
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.