Saya memiliki program Python yang bekerja dengan banyak kamus. Saya harus membuat salinan kamus ribuan kali. Saya memerlukan salinan kunci dan konten terkait. Salinan akan diedit dan tidak boleh ditautkan ke aslinya (mis. Perubahan dalam salinan tidak boleh mempengaruhi aslinya.)
Kunci adalah String, Nilai adalah Integer (0/1).
Saat ini saya menggunakan cara sederhana:
newDict = oldDict.copy()
Memprofil Kode saya menunjukkan bahwa operasi penyalinan memakan sebagian besar waktu.
Apakah ada alternatif yang lebih cepat untuk dict.copy()
metode ini? Apa yang tercepat?
python
performance
dictionary
copy
Joern
sumber
sumber
bool
menjadi pilihan yang lebih baik daripadaint
?bool
dalam Python bernamaint
.bool
tipe sebenarnya adalah subclass (subtipe?) Dariint
tipe tersebut.Jawaban:
Melihat sumber C untuk
dict
operasi Python , Anda dapat melihat bahwa mereka melakukan penyalinan yang cukup naif (tapi efisien). Ini pada dasarnya bermuara pada panggilan kePyDict_Merge
:Ini melakukan pemeriksaan cepat untuk hal-hal seperti apakah mereka adalah objek yang sama dan jika mereka memiliki objek di dalamnya. Setelah itu, ia melakukan perubahan ukuran / alokasi satu kali ke target dikt dan kemudian menyalin elemen satu per satu. Saya tidak melihat Anda menjadi lebih cepat dari yang ada di dalamnya
copy()
.sumber
Dict.copy tampaknya lebih cepat, seperti yang Anda katakan.
[utdmr@utdmr-arch ~]$ python -m timeit -s "d={1:1, 2:2, 3:3}" "new = d.copy()" 1000000 loops, best of 3: 0.238 usec per loop [utdmr@utdmr-arch ~]$ python -m timeit -s "d={1:1, 2:2, 3:3}" "new = dict(d)" 1000000 loops, best of 3: 0.621 usec per loop [utdmr@utdmr-arch ~]$ python -m timeit -s "from copy import copy; d={1:1, 2:2, 3:3}" "new = copy(d)" 1000000 loops, best of 3: 1.58 usec per loop
sumber
timeit
's-s
argumen:python -m timeit -s "from copy import copy" "new = copy({1:1, 2:2, 3:3})"
. Saat Anda melakukannya, tarik kreasi dict juga (untuk semua contoh.)Dapatkah Anda memberikan contoh kode sehingga saya dapat melihat bagaimana Anda menggunakan copy () dan dalam konteks apa?
Anda bisa menggunakan
Tapi saya tidak berpikir itu akan lebih cepat.
sumber
Saya menyadari ini adalah utas lama, tetapi ini adalah hasil tinggi di mesin pencari untuk "dikt copy python", dan hasil teratas untuk "kinerja salinan dikt", dan saya yakin ini relevan.
Dari Python 3.7,
newDict = oldDict.copy()
lebih cepat hingga 5,5x dari sebelumnya. Khususnya, saat ini,newDict = dict(oldDict)
tampaknya kinerja tersebut tidak mengalami peningkatan.Ada sedikit lebih banyak informasi di sini .
sumber
Bergantung pada hal-hal yang Anda tinggalkan untuk spekulasi, Anda mungkin ingin membungkus kamus asli dan melakukan semacam copy-on-write.
"Salin" kemudian adalah kamus yang mencari barang di kamus "induk", jika belum berisi kunci --- tetapi barang modifikasi itu sendiri.
Ini mengasumsikan bahwa Anda tidak akan mengubah yang asli dan pencarian tambahan tidak berakhir dengan biaya lebih.
sumber
Pengukurannya tergantung pada ukuran kamus. Untuk 10.000 entri, salinan (d) dan d.copy () hampir sama.
a = {b: b for b in range(10000)} In [5]: %timeit copy(a) 10000 loops, best of 3: 186 µs per loop In [6]: %timeit deepcopy(a) 100 loops, best of 3: 14.1 ms per loop In [7]: %timeit a.copy() 1000 loops, best of 3: 180 µs per loop
sumber