คำถามติดแท็ก python-internals

Python ทำงานอย่างไรภายใต้ประทุน? ใช้สำหรับคำถามที่เกี่ยวข้องกับ (เช่น) การตัดสินใจในการออกแบบและโครงสร้างข้อมูลภายในและอัลกอริทึมที่ใช้

10
ทำไม“ 1000000000000000 ในช่วง (1000000000000001)” เร็วมากใน Python 3
ฉันเข้าใจว่าrange()ฟังก์ชั่นซึ่งจริงๆแล้วเป็นประเภทวัตถุใน Python 3สร้างเนื้อหาในทันทีคล้ายกับเครื่องกำเนิด นี่เป็นกรณีที่ฉันคาดว่าบรรทัดต่อไปนี้จะใช้เวลามากเกินไปเพราะในการพิจารณาว่า 1 quadrillion อยู่ในช่วงหรือไม่ต้องสร้างค่า quadrillion: 1000000000000000 in range(1000000000000001) ยิ่งกว่านั้น: ดูเหมือนว่าไม่ว่าฉันจะเพิ่มศูนย์เป็นจำนวนเท่าใดการคำนวณมากหรือน้อยก็ใช้เวลาเท่ากัน ฉันได้ลองสิ่งนี้เช่นกัน แต่การคำนวณก็ยังเกือบจะทันที: 1000000000000000000000 in range(0,1000000000000000000001,10) # count by tens ถ้าฉันพยายามที่จะใช้ฟังก์ชั่นพิสัยของตัวเองผลที่ออกมาไม่ค่อยดีเท่าไหร่ !! def my_crappy_range(N): i = 0 while i < N: yield i i += 1 return อะไรคือสิ่งที่range()วัตถุที่ทำภายใต้ประทุนที่ทำให้มันอย่างรวดเร็ว? คำตอบ Martijn Pieters'ได้รับเลือกเพื่อความสมบูรณ์ของมัน แต่ยังเห็นคำตอบแรก abarnert ของสำหรับการสนทนาที่ดีของสิ่งที่มันหมายถึงการrangeที่จะเป็นที่เต็มเปี่ยมลำดับในหลาม 3 และข้อมูลบางส่วน / คำเตือนเกี่ยวกับความไม่ลงรอยกันศักยภาพในการ__contains__เพิ่มประสิทธิภาพการทำงานข้ามการใช้งานหลาม …

14
มัณฑนากร @property ทำงานอย่างไร
ฉันต้องการที่จะเข้าใจว่าฟังก์ชั่นในตัวทำงานpropertyอย่างไร สิ่งที่ทำให้ฉันสับสนคือpropertyสามารถใช้เป็นมัณฑนากรได้ แต่ใช้อาร์กิวเมนต์เมื่อใช้เป็นฟังก์ชันในตัวเท่านั้นไม่ใช่เมื่อใช้เป็นมัณฑนากร ตัวอย่างนี้มาจากเอกสาร : class C(object): def __init__(self): self._x = None def getx(self): return self._x def setx(self, value): self._x = value def delx(self): del self._x x = property(getx, setx, delx, "I'm the 'x' property.") propertyข้อโต้แย้งของมีgetx, setx, delxและสตริง doc ในรหัสด้านล่างpropertyใช้เป็นมัณฑนากร วัตถุของมันคือxฟังก์ชั่น แต่ในรหัสข้างต้นไม่มีสถานที่สำหรับฟังก์ชั่นวัตถุในการขัดแย้ง class C(object): def __init__(self): self._x = None @property …

11
การใช้ __slots__?
อะไรคือจุดประสงค์__slots__ใน Python - โดยเฉพาะอย่างยิ่งเมื่อฉันต้องการใช้และเมื่อไม่ต้องการ?

11
ตัวดำเนินการ“ is” ทำงานแบบไม่คาดคิดกับจำนวนเต็ม
Наэтотвопросестьответына Stack Overflow нарусском : Присваиваниецелых (int) ในПитоне ทำไมสิ่งต่อไปนี้ถึงทำงานโดยไม่คาดหมายใน Python >>> a = 256 >>> b = 256 >>> a is b True # This is an expected result >>> a = 257 >>> b = 257 >>> a is b False # What happened here? Why is this False? …

4
พจนานุกรมสั่งใน Python 3.6+ หรือไม่
พจนานุกรมมีการเรียงลำดับใน Python 3.6 (ภายใต้การใช้งาน CPython เป็นอย่างน้อย) ไม่เหมือนในสาขาก่อนหน้า ดูเหมือนจะเป็นการเปลี่ยนแปลงที่สำคัญ แต่เป็นเพียงย่อหน้าสั้น ๆ ในเอกสาร มันอธิบายว่าเป็นรายละเอียดการใช้งาน CPython มากกว่าคุณสมบัติภาษา แต่ก็บอกเป็นนัยว่าสิ่งนี้อาจกลายเป็นมาตรฐานในอนาคต การใช้พจนานุกรมใหม่ทำงานได้ดีกว่ารุ่นเก่าในขณะที่รักษาลำดับองค์ประกอบอย่างไร นี่คือข้อความจากเอกสาร: dict()ตอนนี้ใช้เป็น“เล็ก” เป็นตัวแทนผู้บุกเบิกโดย PyPy การใช้หน่วยความจำของ dict ใหม่ () อยู่ระหว่าง 20% ถึง 25% เล็กกว่าเมื่อเปรียบเทียบกับ Python 3.5 PEP 468 (การรักษาลำดับของ ** kwargs ในฟังก์ชั่น) ถูกใช้งานโดยสิ่งนี้ ด้านการรักษาลำดับของการใช้งานใหม่นี้ถือว่าเป็นรายละเอียดการใช้งานและไม่ควรพึ่งพา (อาจเปลี่ยนแปลงได้ในอนาคต แต่เป็นที่ต้องการที่จะมีการใช้งาน dict ใหม่นี้ในภาษาสำหรับรุ่นไม่กี่ก่อนที่จะเปลี่ยนข้อมูลจำเพาะภาษา เพื่อมอบอำนาจความหมายเพื่อรักษาคำสั่งซื้อสำหรับการใช้งาน Python ปัจจุบันและอนาคตทั้งหมดนี้ยังช่วยรักษาความเข้ากันได้ย้อนหลังกับภาษารุ่นเก่าที่คำสั่งการสุ่มซ้ำยังคงมีผลเช่น Python 3.5) (สนับสนุนโดย INADA …

20
เมื่อใดที่ del มีประโยชน์ใน python
ฉันไม่สามารถคิดด้วยเหตุผลใด ๆ ว่าทำไมไพ ธ อนต้องการdelคำหลัก (และภาษาส่วนใหญ่ดูเหมือนจะไม่มีคำหลักที่คล้ายกัน) ตัวอย่างเช่นแทนที่จะลบตัวแปรคนหนึ่งสามารถกำหนดNoneให้มันได้ และเมื่อลบจากพจนานุกรมdelสามารถเพิ่มวิธีการได้ มีเหตุผลใดที่จะเก็บไว้delในงูหลามหรือเป็นร่องรอยของวันเก็บขยะล่วงหน้าของ Python?


2
ทำไมบางลอย <เปรียบเทียบจำนวนเต็มสี่ครั้งช้ากว่าคนอื่น ๆ ?
เมื่อเปรียบเทียบลอยกับจำนวนเต็มคู่ของค่าบางอย่างใช้เวลานานในการประเมินมากกว่าค่าอื่น ๆ ที่มีขนาดใกล้เคียงกัน ตัวอย่างเช่น: &gt;&gt;&gt; import timeit &gt;&gt;&gt; timeit.timeit("562949953420000.7 &lt; 562949953421000") # run 1 million times 0.5387085462592742 แต่ถ้าจำนวนลอยหรือจำนวนเต็มน้อยกว่าหรือใหญ่กว่าการเปรียบเทียบจะทำงานได้เร็วขึ้น: &gt;&gt;&gt; timeit.timeit("562949953420000.7 &lt; 562949953422000") # integer increased by 1000 0.1481498428446173 &gt;&gt;&gt; timeit.timeit("562949953423001.8 &lt; 562949953421000") # float increased by 3001.1 0.1459577925548956 การเปลี่ยนตัวดำเนินการเปรียบเทียบ (เช่นการใช้==หรือ&gt;แทน) จะไม่ส่งผลกระทบต่อเวลาในลักษณะที่สังเกตเห็นได้ สิ่งนี้ไม่ได้เกี่ยวข้องกับขนาดเพียงอย่างเดียวเพราะการเลือกค่าที่มากขึ้นหรือน้อยลงอาจทำให้การเปรียบเทียบเร็วขึ้นดังนั้นฉันจึงสงสัยว่ามันจะลงไปในทางที่โชคร้ายเล็กน้อยที่บิตเรียงกัน เห็นได้ชัดว่าการเปรียบเทียบค่าเหล่านี้เร็วกว่าเพียงพอสำหรับกรณีใช้งานส่วนใหญ่ ฉันแค่อยากรู้ว่าทำไม Python ดูเหมือนจะต่อสู้กับค่าบางคู่มากกว่ากับคนอื่น

2
ทำไม 'x' in ('x',) เร็วกว่า 'x' == 'x'
&gt;&gt;&gt; timeit.timeit("'x' in ('x',)") 0.04869917374131205 &gt;&gt;&gt; timeit.timeit("'x' == 'x'") 0.06144205736110564 ใช้ได้กับสิ่งอันดับด้วยหลายองค์ประกอบทั้งสองเวอร์ชันดูเหมือนจะเติบโตเป็นเส้นตรง: &gt;&gt;&gt; timeit.timeit("'x' in ('x', 'y')") 0.04866674801541748 &gt;&gt;&gt; timeit.timeit("'x' == 'x' or 'x' == 'y'") 0.06565782838087131 &gt;&gt;&gt; timeit.timeit("'x' in ('y', 'x')") 0.08975995576448526 &gt;&gt;&gt; timeit.timeit("'x' == 'y' or 'x' == 'y'") 0.12992391047427532 จากนี้ผมคิดว่าผมควรจะโดยสิ้นเชิงเริ่มใช้inทุกแทน==!

8
ล็อคล่ามสากล (GIL) ใน CPython คืออะไร
ล็อคล่ามระดับโลกคืออะไรและทำไมจึงมีปัญหา? มีเสียงดังรบกวนมากมายเกี่ยวกับการนำ GIL ออกจาก Python และฉันต้องการที่จะเข้าใจว่าทำไมจึงมีความสำคัญ ฉันไม่เคยเขียนคอมไพเลอร์หรือล่ามเองดังนั้นอย่าประหยัดกับรายละเอียดฉันอาจต้องการให้พวกเขาเข้าใจ

8
สิ่งอันดับมีประสิทธิภาพมากกว่ารายการใน Python หรือไม่
มีความแตกต่างของประสิทธิภาพระหว่างสิ่งอันดับและรายการเมื่อพูดถึงการสร้างอินสแตนซ์และการดึงองค์ประกอบ?


5
การเข้าถึงตัวแปรคลาสจากรายการความเข้าใจในการกำหนดคลาส
คุณเข้าถึงตัวแปรคลาสอื่น ๆ ได้อย่างไรจากรายการความเข้าใจภายในนิยามคลาส? การทำงานต่อไปนี้ใน Python 2 แต่ล้มเหลวใน Python 3: class Foo: x = 5 y = [x for i in range(1)] Python 3.2 ให้ข้อผิดพลาด: NameError: global name 'x' is not defined การพยายามFoo.xไม่ทำงานเช่นกัน ความคิดเห็นเกี่ยวกับวิธีการทำเช่นนี้ใน Python 3 ตัวอย่างแรงจูงใจที่ซับซ้อนกว่าเล็กน้อย: from collections import namedtuple class StateDatabase: State = namedtuple('State', ['name', 'capital']) db = [State(*args) …

3
ทำไม x ** 4.0 เร็วกว่า x ** 4 ใน Python 3
ทำไมจึงx**4.0เร็วกว่าx**4? ฉันใช้ CPython 3.5.2 $ python -m timeit "for x in range(100):" " x**4.0" 10000 loops, best of 3: 24.2 usec per loop $ python -m timeit "for x in range(100):" " x**4" 10000 loops, best of 3: 30.6 usec per loop ฉันพยายามเปลี่ยนพลังที่ฉันยกขึ้นมาเพื่อดูว่ามันทำหน้าที่อย่างไรและตัวอย่างเช่นถ้าฉันเพิ่ม x เป็นพลังของ 10 หรือ 16 มันกระโดดจาก 30 …

3
เหตุใดรายการที่เหมือนกันสองรายการจึงมีหน่วยความจำแตกต่างกัน
ฉันสร้างสองรายการl1และl2แต่แต่ละคนด้วยวิธีการสร้างที่แตกต่างกัน: import sys l1 = [None] * 10 l2 = [None for _ in range(10)] print('Size of l1 =', sys.getsizeof(l1)) print('Size of l2 =', sys.getsizeof(l2)) แต่ผลลัพธ์ที่ทำให้ฉันประหลาดใจ: Size of l1 = 144 Size of l2 = 192 รายการที่สร้างด้วย list comprehension มีขนาดใหญ่กว่าในหน่วยความจำ แต่ทั้งสองรายการนั้นเหมือนกันใน Python ทำไมถึงเป็นอย่างนั้น? นี่เป็นสิ่งภายใน CPython หรือมีคำอธิบายอื่น ๆ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.