Siempre he estado usando este método:
from sys import argv
y usar argvsolo 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.modulesmapeo), por lo tanto, si lo usaimport sysofrom sys import argvno tiene probabilidades.La única diferencia entre las dos declaraciones es qué nombre está vinculado;
import sysvincula el nombresysal módulo (sosys->sys.modules['sys']), mientras quefrom sys import argvvincula un nombre diferenteargv, apuntando directamente al atributo contenido dentro del módulo (soargv->sys.modules['sys'].argv). El resto delsysmó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.argvtiene que buscar dos cosas; tiene que buscarsysen su espacio de nombres global (encuentra el módulo), luego busque el atributoargv. Y sí, al usarfrom sys import argvpuede omitir la búsqueda de atributos, ya que ya tiene una referencia directa al atributo. Pero laimportdeclaración aún tiene que hacer ese trabajo, busca el mismo atributo al importar, y solo necesitará usarargvuna vez . Si tuviera que usarargvmiles 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.argven algún lugar de un módulo grande deja mucho más claro a qué se refiere queargvnunca.Si el único lugar que usa
argves en un'__main__'bloque para llamar a unamain()función, utilícelofrom sys import argvsi se siente más feliz al respecto:Todavía lo usaría
import sysyo 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...importpermite hacer enpackage.attributelugar 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. (numpyhace algo como esto, creo.)from django.core.management.base import BaseCommandson 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 ... aspara encontrar el paquete a un nombre diferente:import package.subpackage_or_module as shortname.from parent import subhace, esencialmente, lo mismo.Hay dos razones a favor de usar en
import modulelugar 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 modulees menos trabajo para el intérprete quefrom module import func.fuente
Yo uso
from imports 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
imports 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
importmejora 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
aspalabra clave y les doy alias cortos:Como excepción, siempre uso la
from module import somethingnotació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 sysyfrom sys import agrvtanto importar todo elsysmódulo, este último se usa el nombre de unión a lo que sólo elargvmó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 modulecon lafrom module import nameforma correcta, añadir que la búsqueda de nombres para elimport modulecaso. Por ejemplo, agregue la líneasys.argva laarprueba, 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 sysluego usarsys.argvmiles de veces en un ciclo versusfrom sys import argvluego 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.functiones prácticamente el estándar, al menos para los módulos estándar. La única excepción parece serdatetimepor 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
sysoposix),sinse 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,osyiono son paquetes integradosfuente