การนำเข้าโมดูลไม่เสียอะไร ; โมดูลจะถูกนำเข้าอย่างเต็มที่เสมอ(เข้าไปในการ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)