Mindig ezt a módszert használtam:
from sys import argv
és használja a argv
parancsot csak argv használatával. De van ennek egy szokása:
import sys
és az argv használatával sys.argv
A második módszer a kódot öndokumentálttá teszi, és én (tényleg) betartom azt. Az ok, amiért inkább az első módszert részesítem előnyben, gyors, mert csak a szükséges funkciót importáljuk, ahelyett, hogy az egész modult importálnánk (amely több haszontalan függvényt tartalmaz, amelyek a python időt veszteget az importálásukra). Ne feledje, hogy csak argv-ra van szükségem, és a sys összes többi funkciója haszontalan számomra.
Tehát a kérdéseim igen. Az első módszer valóban gyorsá teszi a szkriptet? Melyik módszert részesítik előnyben leginkább? Miért?
Megjegyzések
Válasz
A modul importálása nem pazarolja el a semmit ; a modul mindig teljesen importálva (a sys.modules
leképezésbe), tehát a import sys
vagy a from sys import argv
nincs esély.
A két állítás között csak az a különbség, hogy mi a név kötött; import sys
megköti a sys
a modulhoz (tehát sys
-> sys.modules["sys"]
), míg az from sys import argv
köt egy másik név, argv
, amely egyenesen a modulban található attribútumra mutat (tehát argv
-> sys.modules["sys"].argv
). A többi th Az e sys
modul még mindig ott van, függetlenül attól, hogy használ-e bármi mást a modulból, vagy sem.
A két megközelítés között szintén nincs teljesítménybeli különbség. Igen, sys.argv
két dolgot kell utánanéznie; meg kell keresnie a sys
-t a globális névtérben (megtalálja a modult), majd meg kell keresnie az argv
attribútumot. És igen, a from sys import argv
használatával kihagyhatja az attribútumkeresést, mivel már van közvetlen hivatkozása az attribútumra. De a import
utasításnak még mindig ezt a munkát kell végeznie, importáláskor ugyanazt az attribútumot keresi, és csak akkor kell használnia a argv
egyszer . Ha a ciklusban ezerszer használnod kell az argv
t, az talán változást hozhat, de ebben a konkrét esetben valóban nem .
Ekkor az egyik vagy a másik közötti választás helyett a kódolási stílus t kell alapulnia.
Egy nagy modulban , Minden bizonnyal import sys
; a kóddokumentáció számít, és az sys.argv
használata valahol egy nagy modulban sokkal világosabbá teszi, hogy mire hivatkozik, mint csak argv
valaha.
Ha az egyetlen hely, amelyet argv
használ, egy "__main__"
blokkban található, hogy felhívhasson egy main()
függvény, mindenképpen használja a from sys import argv
szolgáltatást, ha ennek jobban örül:
if __name__ == "__main__": from sys import argv main(argv)
I “d még mindig használom import sys
ott magam. Minden dolog egyenlő (és pontosan a teljesítmény szempontjából és az íráshoz használt karakterek száma) , ez a szememre nézve könnyebb.
Ha valami mást importál, akkor talán a teljesítmény játszik szerepet. De csak akkor, ha egy adott nevet használsz egy modul sokszor , például egy kritikus ciklusban. De akkor egy helyi név (egy függvényen belül) létrehozása még mindig gyorsabb lesz:
import somemodule def somefunction(): localname = somemodule.somefunctionorother while test: # huge, critical loop foo = localname(bar)
Megjegyzések
- Előfordulhat olyan helyzet is, amikor van olyan csomagod, amely alcsomagokat vagy modulokat tartalmaz, és amely a legfelső szintű csomagban található egyik ilyen alcsomag / modul egyik attribútumát tárja fel. A
from...import
használata lehetővé teszi, hogypackage.attribute
helyettpackage.subpackage_or_module.attribute
tegye, ami hasznos lehet, ha logikai vagy fogalmi csoportosításokat tartalmazzon a csomagban, de szeretné kicsit kényelmesebbé tenni a csomag felhasználói számára. (numpy
ilyesmit csinál, azt hiszem.) - A djangóban rengeteg folt van, ahol például
from django.core.management.base import BaseCommand
jobbak, és bármi más (különösenimport django
) olvashatatlan kódhoz vezetne. Tehát bár tetszik ez a válasz, azt hiszem, vannak olyan könyvtárak (és különösen néhány keretrendszer), amelyekben az egyezmény sérti a csupasz importot.Mint mindig, használja megítélését arról, hogy mi a legjobb az adott helyzetben. De tévedjen az explicit oldalon (más szóval többnyire egyetértek). - @JAB: akkor is használhatja a
import ... as
-t a csomag megtalálásához egy másik név:import package.subpackage_or_module as shortname
.from parent import sub
lényegében ugyanazt csinálja. -
so wether you use import sys or from sys import argv makes no odds
úgy tűnik, hogy ez nem így van az IDLE esetében. csak a modul importálása nem importálja a függvényeit, és csak az < modul > segítségével hívhatom meg az IDLE shellben. < function > név - @Suncatcher: olvassa el teljes egészében a válaszomat. Az idézett mondat arról beszél, hogy mennyit importálnak, és nem arról, hogy milyen név van kötve. Ezt ‘ máshol is lefedik a válaszban.
Válasz
Két oka van annak, hogy a import module
-t használja a from module import function
helyett.
Az első a névtér. A függvény globális névtérbe történő importálása a névütközések kockázatát jelentheti.
A második nem a szabványos modulok szempontjából releváns, de az Ön számára fontos, különösen a fejlesztés során. Ez a lehetőség reload()
modul. Fontolja meg ezt:
from module import func ... reload(module) # func still points to the old code
Másrészt
import module ... reload(module) # module.func points to the new code
Ami a sebességet illeti .. .
csak a szükséges funkciót importáljuk, ahelyett, hogy a teljes modult importálnánk (amely több haszontalan függvényt tartalmaz, amelyek a python elvesztegetni fogja az idejét az importálásukkal) / p>
Akár importál egy modult, akár egy függvényt importál egy modulból, a Python elemzi az egész modult. Bármelyik módon is importálja a modult. A “függvény importálása” nem más, mint a függvény névhez kötése. Valójában a import module
kevesebb munka a tolmács számára, mint a from module import func
.
Megjegyzések
- a reload () a Python 2 beépített része volt; ez már nem a Python 3 esetében van.
- Úgy gondoltam, hogy a körkörös importfüggőségekkel is összefüggések vannak?
Válasz
A from import
s elemeket mindig használom, amikor javítja az olvashatóságot. Például jobban szeretem (a pontosvesszők itt csak helyet takarítanak meg):
from collections import defaultdict from foomodule import FooBar, FooBaz from twisted.internet.protocol import Factory defaultdict(); FooBar(); FooBaz(); Factory()
a következő helyett:
import collections import foomodule import twisted.internet.protocol collections.defaultdict(); foomodule.FooBar(); foomodule.FooBaz() twisted.internet.protocol.Factory()
Ez utóbbi számomra nehezebben olvasható (és írható), mert annyi felesleges információt tartalmaz. Hasznos idő előtt tudni, hogy a modul mely részeit használom.
Inkább a rendszeres import
seket kedvelem, ha sokakat használok rövid nevek egy modulból:
import sys sys.argv; sys.stderr; sys.exit()
Vagy ha egy név annyira általános, hogy nincs értelme a névterén kívül:
import json json.loads(foo) from json import loads loads(foo) # potentially confusing
Megjegyzések
- Ez a kedvenc válaszom. A ‘ Az explicit jobb, mint az implicit. A ‘ néha ütközik az olvashatósággal, az egyszerűséggel és a SZÁRAZSAL. Különösen akkor, ha olyan keretrendszert használunk, mint a Django.
Válasz
Véleményem szerint a rendszeres import
javítja az olvashatóságot. A Python-kód áttekintésekor szívesen látom, hogy az adott függvény vagy osztály honnan származik ott, ahol használják. Megtakarít, hogy a modul tetejére görgessem ezeket az információkat.
Ami a hosszú modulneveket illeti, csak a as
kulcsszót használom, és rövidet adok nekik. álnevek:
import collections as col import foomodule as foo import twisted.internet.protocol as twip my_dict = col.defaultdict() foo.FooBar() twip_fac = twip.Factory()
Kivételként mindig a from module import something
jelölést használom, amikor a __future__
modul. Csak nem teheti meg más módon, ha azt szeretné, hogy az összes karakterlánc alapértelmezés szerint unicode legyen a Python 2-ben, pl.
from __future__ import unicode_literals from __future__ import print_function
Megjegyzések
- Ámen! ” import, mivel ” nyerő kombináció 🙂
Válasz
Bár import sys
és from sys import agrv
mindkettő a teljes sys
modult importálja, utóbbi névkötést használ, így csak a argv
modul érhető el a kód többi részéhez.
Néhány ember számára ez lenne az előnyben részesített stílus, mivel csak az Ön által kifejezetten megadott funkciót teszi elérhetővé.
Ez azonban potenciális névütközéseket hoz létre. Mi lenne, ha lenne egy másik modulja, neve argv
? Ne feledje, hogy a függvényt kifejezetten importálhatja és átnevezheti a from sys import argv as sys_argv
névvel is, amely egyezmény megfelel a kifejezett importálásnak, és kevésbé valószínű, hogy adjon névteret ütközések.
Megjegyzések
- Tehát
if sys_argv:
hogyan jobb mintif sys.argv:
? Tudom, mit jelent a második állítás, fogalmam sincs, mit jelent az első forma, anélkül, hogy visszalépnék a bizarr importhoz.
Válasz
Nemrég tettem fel magamnak ezt a kérdést. Időzítettem a különböző módszereket.
könyvtárat kér
def r(): import requests return "hello" timeit r() # output: 1000000 loops, best of 3: 1.55 µs per loop def rg(): from requests import get return "hello" timeit rg() # output: 100000 loops, best of 3: 2.53 µs per loop
beautifulsoup könyvtár
def bs(): import bs4 return "hello" timeit bs() # output: 1000000 loops, best of 3: 1.53 µs per loop def be(): from bs4 import BeautifulSoup return "hello" timeit be() # output: 100000 loops, best of 3: 2.59 µs per loop
json könyvtár
def js(): import json return "hello" timeit js() # output: 1000000 loops, best of 3: 1.53 µs per loop def jl(): from json import loads return "hello" timeit jl() # output: 100000 loops, best of 3: 2.56 µs per loop
sys könyvtár
def s(): import sys return "hello" timeit s() # output: 1000000 loops, best of 3: 1.55 µs per loop def ar(): from sys import argv return "hello" timeit ar() # output: 100000 loops, best of 3: 2.87 µs per loop
Úgy tűnik, hogy nekem, hogy van egy kis különbség a teljesítményben.
Megjegyzések
- Hozzáad egy attribútumkereséshez. A
import module
és afrom module import name
megfelelő összehasonlításához adja hozzá ezt a névkeresést aimport module
eset. Például. adja hozzá asys.argv
sort aar
teszthez stb. Még mindig lesz különbség, mert az elvégzett munka kissé más, mivel különböző byte-kód generálódik és különböző kódutak futtatásra kerülnek. - Ne feledje, hogy a válaszomban közvetlenül foglalkozom ezzel a különbséggel; különbség lesz a
import sys
, majd a ciklusban azsys.argv
több ezer idő és afrom sys import argv
, majd csak aargv
parancsot használja. De nem ‘ t. Olyan dolgok miatt, amelyeket csak egyszer tesz a modul globális szintjén, valóban az olvashatóságra kell optimalizálnia, nem pedig az időzítés mikroszkopikus különbségeire. - Ahhhh! És azt hittem, valamivel foglalkozom! 🙂 Csak a válaszodat soványítottam el. Úgy tűnik, hogy ráugrottam a fegyverre. Jólesik, ha megalázkodunk.
Válasz
A közzétett kódrészletek megtekintése, teljes modulok importálása és a module.function
nagyjából a szabvány, legalábbis a standard modulok esetében. Az egyetlen kivétel úgy tűnik, hogy datetime
from datetime import datetime, timedelta
, így mondhatja: datetime.now()
helyett datetime.datetime.now()
.
Ha aggódsz a teljesítmény miatt, mindig mondhatsz (például)
argv = sys.argv
, majd végezze el a teljesítménykritikus kódot, mivel a modul keresése már megtörtént. Bár ez a funkciókkal / módszerekkel működni fog, az IDE-k többsége összezavarodik, és nem fog (például) egy forrás linket / aláírást megjeleníteni a függvényhez, amikor azt egy változóhoz rendelték.
Válasz
Csak annyit szeretnék hozzáfűzni, hogy ha ilyet csinál,
from math import sin
(vagy bármely más beépített könyvtár, például sys
vagy posix
), akkor sin
szerepeljen a modul dokumentációjában (azaz amikor >>> help(mymodule)
vagy $ pydoc3 mymodule
műveletet hajt végre. Ennek elkerülése érdekében importálja a következőket:
import math from math import sin as _sin
PS: a beépített könyvtár egy, amelyet C-kódból állítanak össze és a Python is tartalmaz. argparse
, os
és a io
nem beépített csomagok
from … import …
szintaxis mögött álló Python