Siempre he estado usando este método:
from sys import argv
y usar argv
solo con argv . Pero hay una convención de usar esto:
import sys
y usando el argv por sys.argv
El segundo método hace que el código se auto documenta y yo (realmente) me adhiero a él. Pero la razón por la que prefiero el primer método es que es rápido porque estamos importando solo la función que se necesita en lugar de importar todo el módulo (que contiene más funciones inútiles que Python perderá tiempo importándolas). Tenga en cuenta que solo necesito argv y todas las demás funciones de sys son inútiles para mí.
Entonces mis preguntas son. ¿El primer método realmente hace que el script sea rápido? ¿Qué método es el más preferido? ¿Por qué?
from … import …
sintaxis en PythonRespuestas:
Importar el módulo no desperdicia nada ; el módulo siempre se importa completamente (en el
sys.modules
mapeo), por lo tanto, si lo usaimport sys
ofrom sys import argv
no tiene probabilidades.La única diferencia entre las dos declaraciones es qué nombre está vinculado;
import sys
vincula el nombresys
al módulo (sosys
->sys.modules['sys']
), mientras quefrom sys import argv
vincula un nombre diferenteargv
, apuntando directamente al atributo contenido dentro del módulo (soargv
->sys.modules['sys'].argv
). El resto delsys
módulo todavía está allí, ya sea que use algo más del módulo o no.Tampoco hay diferencia de rendimiento entre los dos enfoques. Sí,
sys.argv
tiene que buscar dos cosas; tiene que buscarsys
en su espacio de nombres global (encuentra el módulo), luego busque el atributoargv
. Y sí, al usarfrom sys import argv
puede omitir la búsqueda de atributos, ya que ya tiene una referencia directa al atributo. Pero laimport
declaración aún tiene que hacer ese trabajo, busca el mismo atributo al importar, y solo necesitará usarargv
una vez . Si tuviera que usarargv
miles de veces en un bucle, tal vez podría hacer una diferencia, pero en este caso específico realmente no lo hace.La elección entre uno u otro debe basarse en el estilo de codificación .
En un módulo grande , ciertamente lo usaría
import sys
; la documentación del código es importante, y el usosys.argv
en algún lugar de un módulo grande deja mucho más claro a qué se refiere queargv
nunca.Si el único lugar que usa
argv
es en un'__main__'
bloque para llamar a unamain()
función, utilícelofrom sys import argv
si se siente más feliz al respecto:Todavía lo usaría
import sys
yo mismo. En igualdad de condiciones (y son, exactamente, en términos de rendimiento y número de caracteres utilizados para escribirlo), eso es más fácil para mí.Si está importando algo completamente diferente , entonces quizás el rendimiento entre en juego. Pero solo si usa un nombre específico en un módulo muchas veces , en un ciclo crítico, por ejemplo. Pero luego crear un nombre local (dentro de una función) va a ser aún más rápido:
fuente
from...import
permite hacer enpackage.attribute
lugar de hacerlopackage.subpackage_or_module.attribute
, lo cual puede ser útil si tiene agrupaciones lógicas o conceptuales dentro del paquete pero desea hacer las cosas un poco más convenientes para los usuarios de su paquete. (numpy
hace algo como esto, creo.)from django.core.management.base import BaseCommand
son mejores, y cualquier otra cosa (especialmenteimport django
) conduciría a un código ilegible. Entonces, aunque me gusta esta respuesta, creo que hay algunas bibliotecas (y especialmente algunos marcos) en las que la convención es violar la importación simple. Como siempre, use su criterio sobre lo que es mejor en una situación dada. Pero errar del lado de lo explícito (en otras palabras, estoy de acuerdo en su mayor parte).import ... as
para encontrar el paquete a un nombre diferente:import package.subpackage_or_module as shortname
.from parent import sub
hace, esencialmente, lo mismo.Hay dos razones a favor de usar en
import module
lugar defrom module import function
.Primero es el espacio de nombres. Importar una función en el espacio de nombres global conlleva riesgos de colisiones de nombres.
Segundo, no es tan relevante para los módulos estándar, sino significativo para sus propios módulos, especialmente durante el desarrollo. Es la opción de
reload()
un módulo. Considera esto:Por otra parte
En cuanto a la velocidad ...
Ya sea que importe un módulo o importe una función desde un módulo, Python analizará todo el módulo. De cualquier manera, el módulo se importa. "Importar una función" no es más que vincular la función a un nombre. De hecho
import module
es menos trabajo para el intérprete quefrom module import func
.fuente
Yo uso
from import
s siempre que mejora la legibilidad. Por ejemplo, prefiero (los puntos y comas son solo para ahorrar espacio aquí):en lugar de:
Lo último es más difícil de leer (y escribir) para mí porque contiene mucha información redundante. Además, es útil saber de antemano qué partes de un módulo estoy usando.
Prefiero
import
s regulares si estoy usando muchos nombres cortos de un módulo:O si un nombre es tan genérico que no tiene sentido fuera de su espacio de nombres:
fuente
En mi opinión, el uso regular
import
mejora la legibilidad. Cuando reviso el código de Python, me gusta ver de dónde proviene la función o clase dada de donde se usa. Me ahorra desplazarme hacia la parte superior del módulo para obtener esa información.En cuanto a los nombres largos del módulo, solo uso la
as
palabra clave y les doy alias cortos:Como excepción, siempre uso la
from module import something
notación cuando trato con el__future__
módulo. Simplemente no puede hacerlo de otra manera cuando desea que todas las cadenas sean unicode por defecto en Python 2, por ejemplofuente
Si bien
import sys
yfrom sys import agrv
tanto importar todo elsys
módulo, este último se usa el nombre de unión a lo que sólo elargv
módulo es accesible al resto del código.Para algunas personas, este sería el estilo preferido ya que solo hace accesible la función que usted estableció explícitamente.
Sin embargo, introduce posibles conflictos de nombres. ¿Qué pasa si tienes otro módulo llamado
argv
? Tenga en cuenta que también puede importar explícitamente la función y cambiarle el nombrefrom sys import argv as sys_argv
, una convención que cumple con la importación explícita y es menos probable que dé colisiones de espacio de nombres.fuente
if sys_argv:
mejor queif sys.argv:
? Sé lo que significa la segunda declaración, no tengo idea de lo que significa la primera forma sin dar marcha atrás a la extraña importación.Hace poco me hice esta pregunta. He cronometrado los diferentes métodos.
biblioteca de solicitudes
biblioteca de beautifulsoup
biblioteca json
biblioteca sys
Me parece que hay una ligera diferencia en el rendimiento.
fuente
import module
con lafrom module import name
forma correcta, añadir que la búsqueda de nombres para elimport module
caso. Por ejemplo, agregue la líneasys.argv
a laar
prueba, etc. Todavía habrá una diferencia, porque el trabajo realizado es ligeramente diferente, ya que se genera un código de bytes diferente y se ejecutan diferentes rutas de código.import sys
luego usarsys.argv
miles de veces en un ciclo versusfrom sys import argv
luego usar soloargv
. Pero tu no. Para las cosas que hace solo una vez en el nivel global de su módulo, realmente debe optimizar la legibilidad, no las diferencias microscópicas en los tiempos.Mirar los fragmentos de código publicados, importar módulos completos y hacer referencia
module.function
es prácticamente el estándar, al menos para los módulos estándar. La única excepción parece serdatetime
por lo que se puede decir
datetime.now()
en lugar dedatetime.datetime.now()
.Si le preocupa el rendimiento, siempre puede decir (por ejemplo)
y luego haga su código crítico de rendimiento ya que la búsqueda del módulo ya está hecha. Sin embargo, aunque esto funcionará con funciones / métodos, la mayoría de los IDE se confundirán y no mostrarán (por ejemplo) un enlace / firma de origen para la función cuando se asigna a una variable.
fuente
Solo quiero agregar eso si haces algo como
(o cualquier otra biblioteca incorporada como
sys
oposix
),sin
se incluirá en la documentación de su módulo (es decir, cuando lo haga>>> help(mymodule)
o$ pydoc3 mymodule
. Para evitar esto, importe utilizando:PD: una biblioteca integrada es aquella que se compila a partir del código C y se incluye con Python.
argparse
,os
yio
no son paquetes integradosfuente