Saya selalu menggunakan metode ini:
from sys import argv
dan gunakan argv
hanya dengan argv . Tetapi ada kesepakatan untuk menggunakan ini:
import sys
dan menggunakan argv oleh sys.argv
Metode kedua membuat kode didokumentasikan sendiri dan saya (benar-benar) mematuhinya. Tapi alasan saya lebih suka metode pertama adalah cepat karena kita hanya mengimpor fungsi yang diperlukan daripada mengimpor seluruh modul (yang berisi lebih banyak fungsi tidak berguna yang python akan membuang waktu mengimpornya). Perhatikan bahwa saya hanya perlu argv dan semua fungsi lain dari sys tidak berguna bagi saya.
Jadi pertanyaan saya adalah. Apakah metode pertama benar-benar membuat script cepat? Metode mana yang paling disukai? Mengapa?
from … import …
sintaks dalam PythonJawaban:
Mengimpor modul tidak membuang apa pun ; modul selalu sepenuhnya diimpor (ke
sys.modules
pemetaan), jadi apakah Anda menggunakanimport sys
ataufrom sys import argv
tidak membuat kesulitan.Satu-satunya perbedaan antara kedua pernyataan itu adalah apa nama yang terikat;
import sys
mengikat namasys
ke modul (jadisys
->sys.modules['sys']
), sementarafrom sys import argv
mengikat nama yang berbedaargv
,, menunjuk langsung ke atribut yang terdapat di dalam modul (jadiargv
->sys.modules['sys'].argv
). Sisasys
modul masih ada, apakah Anda menggunakan hal lain dari modul atau tidak.Juga tidak ada perbedaan kinerja antara kedua pendekatan. Ya,
sys.argv
harus mencari dua hal; itu harus mencarisys
di namespace global Anda (menemukan modul), kemudian mencari atributnyaargv
. Dan ya, dengan menggunakanfrom sys import argv
Anda dapat melewati pencarian atribut, karena Anda sudah memiliki referensi langsung ke atribut. Tetapiimport
pernyataan itu masih harus melakukan itu, itu mencari atribut yang sama ketika mengimpor, dan Anda hanya perlu menggunakannyaargv
sekali . Jika Anda harus menggunakanargv
ribuan kali dalam satu lingkaran itu mungkin bisa membuat perbedaan, tetapi dalam kasus khusus ini sebenarnya tidak.Pilihan antara satu atau yang lain itu, harus didasarkan pada gaya pengkodean saja.
Dalam modul besar , saya pasti akan menggunakan
import sys
; dokumentasi kode penting, dan menggunakansys.argv
suatu tempat dalam modul besar membuatnya lebih jelas apa yang Anda maksud daripada yangargv
pernah ada.Jika satu-satunya tempat yang Anda gunakan
argv
adalah dalam'__main__'
blok untuk memanggilmain()
fungsi, tentu saja gunakanfrom sys import argv
jika Anda merasa lebih bahagia tentang hal itu:Saya masih menggunakannya di
import sys
sana sendiri. Semua hal menjadi sama (dan mereka, tepatnya, dalam hal kinerja dan jumlah karakter yang digunakan untuk menulisnya), itu hanya lebih mudah bagi saya.Jika Anda mengimpor sesuatu yang lain sama sekali, maka mungkin kinerja ikut bermain. Tetapi hanya jika Anda menggunakan nama tertentu dalam sebuah modul berkali-kali , dalam loop kritis misalnya. Tetapi kemudian membuat nama lokal (dalam suatu fungsi) akan menjadi lebih cepat:
sumber
from...import
memungkinkan Anda untuk melakukanpackage.attribute
lebih daripadapackage.subpackage_or_module.attribute
, yang dapat berguna jika Anda memiliki pengelompokan logis atau konseptual dalam paket tetapi ingin membuat hal-hal sedikit lebih nyaman bagi pengguna paket Anda. (Sayanumpy
kira melakukan hal seperti ini.)from django.core.management.base import BaseCommand
lebih baik, dan hal lain (terutamaimport django
) akan menyebabkan kode tidak terbaca. Jadi, sementara saya suka jawaban ini, saya pikir ada beberapa perpustakaan (dan terutama beberapa kerangka kerja) di mana konvensi itu melanggar impor kosong. Seperti biasa, gunakan penilaian Anda tentang apa yang terbaik dalam situasi tertentu. Tetapi sesat di sisi eksplisit (dengan kata lain saya setuju untuk sebagian besar).import ... as
untuk menemukan paket untuk nama yang berbeda:import package.subpackage_or_module as shortname
.from parent import sub
pada dasarnya melakukan hal yang sama.Ada dua alasan yang mendukung penggunaan
import module
daripadafrom module import function
.Pertama adalah namespace. Mengimpor fungsi ke namespace global berisiko bertabrakan nama.
Kedua tidak begitu relevan dengan modul standar, tetapi signifikan untuk Anda memiliki modul, terutama selama pengembangan. Ini pilihan untuk
reload()
modul. Pertimbangkan ini:Di samping itu
Adapun kecepatan ...
Apakah Anda mengimpor modul atau mengimpor fungsi dari modul, Python akan mem-parsing seluruh modul. Either way modul diimpor. "Mengimpor fungsi" tidak lebih dari mengikat fungsi ke sebuah nama. Bahkan
import module
lebih sedikit pekerjaan untuk penerjemah daripadafrom module import func
.sumber
Saya menggunakan
from import
s setiap kali itu meningkatkan keterbacaan. Sebagai contoh, saya lebih suka (titik koma hanya untuk menghemat ruang di sini):dari pada:
Yang terakhir lebih sulit untuk dibaca (dan ditulis) untuk saya karena mengandung begitu banyak informasi yang berlebihan. Juga, berguna untuk mengetahui sebelumnya bagian mana dari modul yang saya gunakan.
Saya lebih suka
import
s biasa jika saya menggunakan banyak nama pendek dari modul:Atau jika sebuah nama sangat umum sehingga tidak masuk akal di luar ruang namanya:
sumber
Menurut pendapat saya menggunakan reguler
import
meningkatkan keterbacaan. Saat mengulas kode Python, saya suka melihat dari mana fungsi atau kelas yang diberikan berasal dari tempat kode itu digunakan. Ini menyelamatkan saya dari gulir ke bagian atas modul untuk mendapatkan info itu.Sedangkan untuk nama modul yang panjang saya hanya menggunakan
as
kata kunci dan memberi mereka alias pendek:Sebagai pengecualian saya selalu menggunakan
from module import something
notasi ketika saya berurusan dengan__future__
modul. Anda tidak bisa melakukannya dengan cara lain ketika Anda ingin semua string menjadi unicode secara default di Python 2, misalnyasumber
Meskipun
import sys
danfrom sys import agrv
keduanya mengimpor seluruhsys
modul, yang terakhir menggunakan pengikatan nama sehingga hanyaargv
modul yang dapat diakses untuk sisa kode.Bagi sebagian orang ini akan menjadi gaya yang disukai karena hanya membuat diakses fungsi yang Anda nyatakan secara eksplisit.
Namun itu memperkenalkan potensi konflik nama. Bagaimana jika Anda memiliki modul lain yang dinamai
argv
? Catatan Anda juga dapat secara eksplisit mengimpor fungsi dan mengganti nama denganfrom sys import argv as sys_argv
, konvensi yang memenuhi impor eksplisit dan kecil kemungkinannya untuk memberikan tabrakan ruang nama.sumber
if sys_argv:
lebih baik dari ituif sys.argv:
? Saya tahu apa arti pernyataan kedua, saya tidak tahu apa arti bentuk pertama tanpa mundur ke impor aneh.Baru-baru ini saya mengajukan pertanyaan ini kepada diri saya sendiri. Saya menghitung waktu berbagai metode.
meminta perpustakaan
perpustakaan beautifulsoup
perpustakaan json
perpustakaan sys
Menurut saya ada sedikit perbedaan dalam kinerja.
sumber
import module
denganfrom module import name
benar, tambahkan pencarian nama keimport module
case. Misalnya menambahkan barissys.argv
kear
tes, dll. Masih akan ada perbedaan, karena pekerjaan yang dilakukan sedikit berbeda, karena bytecode yang berbeda dihasilkan dan codepath yang berbeda dieksekusi.import sys
kemudian menggunakansys.argv
ribuan waktu dalam satu lingkaran vsfrom sys import argv
kemudian menggunakan hanyaargv
. Tapi kamu tidak. Untuk hal-hal yang Anda lakukan sekali saja di tingkat global modul Anda, Anda harus benar-benar mengoptimalkan keterbacaan, bukan perbedaan waktu yang mikroskopis.Melihat fragmen kode yang diterbitkan, mengimpor seluruh modul dan merujuk
module.function
cukup banyak standar, setidaknya untuk modul standar. Satu-satunya pengecualian tampaknyadatetime
sehingga Anda bisa mengatakan
datetime.now()
bukandatetime.datetime.now()
.Jika Anda khawatir tentang kinerja, Anda selalu bisa mengatakan (misalnya)
dan kemudian lakukan kode kritis kinerja Anda karena pencarian modul sudah dilakukan. Namun meskipun ini akan bekerja dengan fungsi / metode, sebagian besar IDE akan menjadi bingung dan tidak akan (misalnya) menampilkan tautan sumber / tanda tangan untuk fungsi ketika itu ditugaskan ke variabel.
sumber
Saya hanya ingin menambahkan itu jika Anda melakukan sesuatu seperti
(atau perpustakaan bawaan lainnya seperti
sys
atauposix
), makasin
akan dimasukkan dalam dokumentasi untuk modul Anda (yaitu ketika Anda melakukannya>>> help(mymodule)
atau$ pydoc3 mymodule
. Untuk menghindari ini, impor menggunakan:PS: perpustakaan bawaan adalah yang dikompilasi dari kode C dan disertakan dengan Python.
argparse
,os
danio
bukan paket bawaansumber