항상이 방법을 사용해 왔습니다.

from sys import argv 

argv 와 함께 argv를 사용합니다. 그러나 이것을 사용하는 규칙이 있습니다 :

import sys 

그리고 sys.argv

두 번째 방법은 코드를 자체 문서화하고 (정말) 준수합니다. 그러나 내가 첫 번째 방법을 선호하는 이유는 전체 모듈을 가져 오는 것보다 필요한 함수 만 가져 오기 때문에 빠르기 때문입니다 (파이썬이 가져 오는 데 시간을 낭비하는 쓸모없는 함수를 포함하고 있습니다). argv 만 필요하고 sys의 다른 모든 기능은 쓸모가 없습니다.

그래서 내 질문은 있습니다. 첫 번째 방법은 실제로 스크립트를 빠르게 만드는가? 어떤 방법이 가장 선호됩니까? 그 이유는 무엇입니까?

댓글

답변

모듈 가져 오기는 아무것도 낭비하지 않습니다. 모듈은 항상 완전히 (sys.modules 매핑으로) 가져 왔으므로 import sys 또는 from sys import argv는 확률이 없습니다.

두 문장의 유일한 차이점은 이름이 바인딩되는 것입니다. import sys는 이름을 바인딩합니다. sys를 모듈 (예 : sys-> sys.modules["sys"])에 연결하는 반면 from sys import argv는 바인딩합니다. 다른 이름, argv, 모듈 내부에 포함 된 속성을 바로 가리 킵니다 (따라서 argv-> sys.modules["sys"].argv). 나머지는 e sys 모듈은 모듈의 다른 것을 사용하든 사용하지 않든 여전히 존재합니다.

두 접근 방식간에 성능 차이도 없습니다. 예, sys.argv는 두 가지를 찾아야합니다. 글로벌 네임 스페이스 (모듈 찾기)에서 sys를 찾은 다음 argv 속성을 찾아야합니다. 예, from sys import argv를 사용하면 이미 속성에 대한 직접 참조가 있으므로 속성 조회를 건너 뛸 수 있습니다. 그러나 import 문은 여전히 해당 작업을 수행해야하며 가져올 때 동일한 속성을 조회하며 “argv 한 번 . 루프에서 argv 수천 번을 사용해야한다면 차이가있을 수 있지만이 특정 경우에는 그렇지 않습니다. .

둘 중 하나를 선택하는 대신 코딩 스타일 을 기반으로해야합니다.

대형 모듈에서 , 저는 확실히 import sys를 사용합니다. 코드 문서화가 중요하며, 대형 모듈의 어딘가에서 sys.argv를 사용하면 argv보다 훨씬 더 명확하게 참조 할 수 있습니다.

argv를 사용하는 유일한 장소가 iv id = “8ea71d7f78″을 호출하는 "__main__" 블록에있는 경우 >

함수를 사용합니다. 더 행복하다고 느끼면from sys import argv를 사용하세요.

if __name__ == "__main__": from sys import argv main(argv) 

I “d 여전히 거기에서 import sys를 사용합니다. 모든 것이 동일합니다 (정확히 작성하는 데 사용 된 문자 수 문자 수). , 그것은 제 눈에 더 쉽습니다.

다른 무언가를 모두 가져 오는 경우 성능이 작용할 수 있습니다. 그러나 특정 이름을 사용하는 경우에만 예를 들어 중요한 루프에서 모듈을 여러 번 반복 합니다.하지만 함수 내에서 로컬 이름을 만드는 것이 더 빠를 것입니다.

 import somemodule def somefunction(): localname = somemodule.somefunctionorother while test: # huge, critical loop foo = localname(bar) 

주석

  • 또한 최상위 패키지에있는 하위 패키지 / 모듈 중 하나의 속성을 노출하는 하위 패키지 또는 모듈이있는 패키지가있는 상황도 있습니다. from...import를 사용하면 package.subpackage_or_module.attribute 대신 package.attribute를 수행 할 수 있습니다. 패키지 내에 논리적 또는 개념적 그룹이 있지만 패키지 사용자에게 좀 더 편리하게 만들고자합니다. (numpy는 이런 일을합니다.)
  • 장고에는 from django.core.management.base import BaseCommand가 더 좋으며 다른 것 (특히 import django)은 읽을 수없는 코드로 이어질 수 있습니다. 그래서 나는이 대답을 좋아하지만, 관례가 베어 수입을 위반하는 일부 라이브러리 (특히 일부 프레임 워크)가 있다고 생각합니다.항상 그렇듯이 주어진 상황에서 무엇이 가장 좋은지 판단하십시오. 하지만 명시 적 측면에서 오류가 있습니다 (즉, 대부분 동의합니다).
  • @JAB : 여전히 import ... as를 사용하여 패키지를 찾을 수 있습니다. 다른 이름 : import package.subpackage_or_module as shortname. from parent import sub는 기본적으로 동일한 작업을 수행합니다.
  • so wether you use import sys or from sys import argv makes no odds IDLE에서는 그렇지 않은 것 같습니다. 모듈을 가져 오는 것만으로는 함수를 가져 오지 않으며 < 모듈 >에 의해서만 IDLE 셸에서 호출 할 수 있습니다. < 기능 > 이름
  • @Suncatcher : 내 대답을 전부 읽어주세요. 인용 한 문장은 어떤 이름이 바인딩되는지가 아니라 얼마나 많이 수입되는지에 대해 이야기합니다. ‘는 답변의 다른 부분에서 다룹니다.

답변

from module import function 대신 import module를 사용하는 데는 두 가지 이유가 있습니다.

첫 번째는 네임 스페이스입니다. 함수를 전역 네임 스페이스로 가져 오면 이름 충돌이 발생할 위험이 있습니다.

두 번째는 표준 모듈과 관련이 없지만 특히 개발 과정에서 자신의 모듈에 중요합니다. 모듈. 다음을 고려하십시오.

from module import func ... reload(module) # func still points to the old code 

반면에

import module ... reload(module) # module.func points to the new code 

속도는 .. .

전체 모듈을 가져 오는 대신 필요한 함수 만 가져옵니다 (파이썬이 가져 오는 데 시간을 낭비하는 쓸모없는 함수가 더 많이 포함되어 있음).

모듈을 가져 오든 모듈에서 함수를 가져 오든간에 Python은 전체 모듈을 구문 분석합니다. 어느 쪽이든 모듈을 가져옵니다. “함수 가져 오기”는 함수를 이름에 바인딩하는 것 이상입니다. 사실 import modulefrom module import func보다 통역사에 대한 작업이 적습니다.

댓글

  • reload ()는 Python 2에 내장되어 있습니다. Python 3에서는 더 이상 그렇지 않습니다.
  • 순환 가져 오기 종속성과 관련이 있다고 생각 했습니까?

Answer

가독성이 향상 될 때마다 from import를 사용합니다. 예를 들어, 저는 다음을 선호합니다 (세미콜론은 여기서 공간을 절약하기위한 것입니다).

from collections import defaultdict from foomodule import FooBar, FooBaz from twisted.internet.protocol import Factory defaultdict(); FooBar(); FooBaz(); Factory() 

대신 :

import collections import foomodule import twisted.internet.protocol collections.defaultdict(); foomodule.FooBar(); foomodule.FooBaz() twisted.internet.protocol.Factory() 

후자는 너무 많은 중복 정보를 포함하고 있기 때문에 나를 위해 읽고 쓰기가 더 어렵습니다. 또한 모듈의 어떤 부분을 사용하고 있는지 미리 아는 것이 유용합니다.

많이 사용하는 경우 일반 import를 선호합니다. 모듈의 짧은 이름 :

import sys sys.argv; sys.stderr; sys.exit() 

또는 이름이 너무 일반적이어서 네임 스페이스 밖에서는 의미가없는 경우 :

import json json.loads(foo) from json import loads loads(foo) # potentially confusing 

댓글

  • 제가 가장 좋아하는 답변입니다. ‘ 명시적인 것이 암시적인 것보다 낫습니다 ‘ 때때로 가독성, 단순성 및 DRY와 충돌합니다. 특히 Django와 같은 프레임 워크를 사용할 때.

Answer

내 의견으로는 일반 는 가독성을 향상시킵니다. 파이썬 코드를 검토 할 때 주어진 함수 나 클래스가 사용되는 곳에서 어디에서 오는지 보는 것을 좋아합니다. 정보를 얻기 위해 모듈의 상단으로 스크롤하지 않아도됩니다.

긴 모듈 이름은 as 키워드를 사용하고 짧게 지정합니다. 별칭 :

import collections as col import foomodule as foo import twisted.internet.protocol as twip my_dict = col.defaultdict() foo.FooBar() twip_fac = twip.Factory() 

예외로 iv id =를 다룰 때 항상 from module import something 표기법을 사용합니다. “c58a4bc552”>

모듈. Python 2에서 기본적으로 모든 문자열을 유니 코드로 지정하려는 경우 다른 방법으로 수행 할 수 없습니다. 예 :

from __future__ import unicode_literals from __future__ import print_function 

Comments

  • 아멘! ” 다음으로 가져 오기 “는 최고의 조합입니다. 🙂

답변

하지만 import sysfrom sys import agrv 둘 다 전체 sys 모듈을 가져 오며, 후자는 이름 바인딩을 사용하므로 나머지 코드에서는 argv 모듈에만 액세스 할 수 있습니다.

p>

어떤 사람들에게는 이것이 당신이 명시 적으로 언급 한 함수에만 접근 할 수 있도록하기 때문에 선호되는 스타일 일 것입니다.

그러나 잠재적 인 이름 충돌을 야기합니다.

? 명시 적으로 가져 오기를 충족하고 네임 스페이스를 제공 할 가능성이 적은 규칙 인from sys import argv as sys_argv를 사용하여 함수를 명시 적으로 가져오고 이름을 바꿀 수도 있습니다. 충돌.

댓글

  • if sys_argv:가 ? 나는 두 번째 진술이 무엇을 의미하는지 알고있다. 나는 기괴한 수입으로 되돌아 가지 않고서는 첫 번째 형태가 무엇을 의미하는지 전혀 모른다.

답변

최근 저에게이 질문을했습니다. 다른 방법의 시간을 정했습니다.

요청 라이브러리

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 라이브러리

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 라이브러리

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 라이브러리

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 

성능에 약간의 차이가 있습니다 .

댓글

  • 속성 조회에 추가하고 있습니다. import modulefrom module import name와 올바르게 비교하려면 해당 이름 조회를 import module 추가 하세요.

케이스. 예 :sys.argv줄을ar테스트 등에 추가합니다. 수행 된 작업이 약간 다른 바이트 코드가 생성되고 다른 코드 경로가 실행되므로 다릅니다.

  • 내 대답에서 그 차이를 직접 설명합니다. import sys를 사용하는 것과 sys.argv를 루프에서 수천 번 사용하는 것과 from sys import argv 그런 다음 argv 만 사용합니다. 하지만 ‘ 없습니다. 모듈의 글로벌 수준에서 한 번 만 수행하는 작업의 경우 타이밍의 미세한 차이가 아니라 가독성을 위해 최적화해야합니다.
  • 아아! 그리고 나는 내가 무언가에 있다고 생각했습니다! 🙂 나는 당신의 대답을 훑어 보았다. 내가 총을 쏜 것 같은데. 겸손 해져서 기쁩니다.
  • 답변

    게시 된 코드 조각을보고 전체 모듈을 가져오고 module.function는 적어도 표준 모듈의 경우 거의 표준입니다. 한 가지 예외는 datetime

    from datetime import datetime, timedelta 

    이므로 datetime.now() datetime.datetime.now()가 아닙니다.

    성능이 걱정된다면 언제든지 (예 :)라고 말할 수 있습니다.

    argv = sys.argv 

    모듈 조회가 이미 완료되었으므로 성능에 중요한 코드를 수행하십시오. 그러나 이것은 함수 / 메소드와 함께 작동하지만 대부분의 IDE는 혼란스러워지며 변수에 할당 될 때 함수에 대한 소스 링크 / 서명을 표시하지 않습니다.

    답변

    다음과 같은 작업을 수행하는 경우 추가하고 싶습니다.

    from math import sin 

    (또는 sys 또는 posix와 같은 기타 내장 라이브러리), sin는 모듈에 대한 문서에 포함되어야합니다 (예 : >>> help(mymodule) 또는 $ pydoc3 mymodule를 수행 할 때).이를 방지하려면 다음을 사용하여 가져옵니다.

    import math from math import sin as _sin 

    PS : 내장 라이브러리는 C 코드에서 컴파일되고 Python에 포함 된 라이브러리입니다. argparse, osio는 기본 제공 패키지가 아닙니다.

    답글 남기기

    이메일 주소를 발행하지 않을 것입니다. 필수 항목은 *(으)로 표시합니다