การนำเข้าโมดูลไม่เสียอะไร ; โมดูลจะถูกนำเข้าอย่างเต็มที่เสมอ(เข้าไปในการ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) ส่วนที่เหลือของsysโมดูลยังคงอยู่ที่นั่นไม่ว่าคุณจะใช้สิ่งอื่นจากโมดูลหรือไม่
นอกจากนี้ยังไม่มีความแตกต่างด้านประสิทธิภาพระหว่างสองวิธี ใช่sys.argvต้องค้นหาสองสิ่ง; ก็มีการมองขึ้นsysใน namespace โลกของคุณ (พบโมดูล) argvแล้วมองขึ้นแอตทริบิวต์ และใช่โดยใช้from sys import argvคุณสามารถข้ามการค้นหาแอตทริบิวต์เนื่องจากคุณมีการอ้างอิงโดยตรงไปยังแอตทริบิวต์ แต่importคำสั่งยังคงมีการทำผลงานนั้นก็เงยหน้าขึ้นมองแอตทริบิวต์เดียวกันเมื่อนำเข้าและคุณเท่านั้นที่เคยจะต้องใช้ครั้งเดียวargv หากคุณต้องใช้argvหลายพันครั้งในการวนซ้ำมันอาจจะสร้างความแตกต่างได้ แต่ในกรณีนี้มันไม่ได้เกิดขึ้นจริง
ตัวเลือกระหว่างอย่างใดอย่างหนึ่งนั้นควรขึ้นอยู่กับรูปแบบการเข้ารหัสแทน
ในขนาดใหญ่โมดูลแน่นอนฉันต้องการใช้import sys; เอกสารประกอบการเขียนโค้ดมีความสำคัญและการใช้ที่sys.argvใดที่หนึ่งในโมดูลขนาดใหญ่ทำให้ชัดเจนยิ่งกว่าสิ่งที่คุณอ้างถึงมากกว่าที่argvเคยเป็นมา
หากสถานที่เดียวที่คุณใช้argvอยู่ใน'__main__'บล็อกเพื่อเรียกใช้main()ฟังก์ชันโดยทั้งหมดใช้from sys import argvหากคุณรู้สึกมีความสุขมากขึ้นเกี่ยวกับสิ่งนั้น:
if __name__ == '__main__':
from sys import argv
main(argv)
ฉันยังคงใช้ที่import sysนั่นเอง ทุกสิ่งเท่าเทียมกัน (และแน่นอนในแง่ของประสิทธิภาพและจำนวนตัวอักษรที่ใช้ในการเขียน) นั่นเป็นเรื่องง่ายสำหรับฉัน
หากคุณกำลังนำเข้าสิ่งอื่นโดยสิ้นเชิงอาจเป็นการแสดงที่มีประสิทธิภาพ แต่ถ้าคุณใช้ชื่อเฉพาะในโมดูลหลาย ๆ ครั้งในลูปวิกฤติเช่น แต่จากนั้นการสร้างชื่อท้องถิ่น (ภายในฟังก์ชั่น) จะยังคงเร็วขึ้น:
import somemodule
def somefunction():
localname = somemodule.somefunctionorother
while test:
# huge, critical loop
foo = localname(bar)