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

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

4
ทำไมอาร์เรย์ของ Python จึงช้า
ฉันคาดว่าarray.arrayจะเร็วกว่ารายการเนื่องจากอาร์เรย์ดูเหมือนจะไม่มีกล่อง อย่างไรก็ตามฉันได้รับผลลัพธ์ต่อไปนี้: In [1]: import array In [2]: L = list(range(100000000)) In [3]: A = array.array('l', range(100000000)) In [4]: %timeit sum(L) 1 loop, best of 3: 667 ms per loop In [5]: %timeit sum(A) 1 loop, best of 3: 1.41 s per loop In [6]: %timeit sum(L) 1 loop, best …

4
เป็นไปได้ที่จะ“ แฮ็ก” ฟังก์ชั่นการพิมพ์ของงูใหญ่หรือไม่
หมายเหตุ: คำถามนี้มีวัตถุประสงค์เพื่อให้ข้อมูลเท่านั้น ฉันสนใจที่จะดูว่าภายในของ Python นั้นมีความเป็นไปได้ที่จะทำสิ่งนี้อย่างไร เมื่อไม่นานมานี้การสนทนาเริ่มขึ้นในคำถามที่ว่าสตริงที่ส่งผ่านไปยังคำสั่งพิมพ์สามารถแก้ไขได้หลังจาก / ระหว่างการโทรไปprintหรือไม่ ตัวอย่างเช่นพิจารณาฟังก์ชั่น: def print_something(): print('This cat was scared.') ตอนนี้เมื่อprintทำงานแล้วผลลัพธ์ไปยังเทอร์มินัลควรแสดง: This dog was scared. สังเกตคำว่า "cat" ถูกแทนที่ด้วยคำว่า "dog" บางสิ่งบางอย่างก็สามารถปรับเปลี่ยนบัฟเฟอร์ภายในเหล่านั้นเพื่อเปลี่ยนสิ่งที่พิมพ์ สมมติว่าสิ่งนี้ทำโดยไม่ได้รับอนุญาตอย่างชัดแจ้งจากผู้เขียนรหัสดั้งเดิม (ดังนั้นการแฮ็ค / การไฮแจ็ก) ความคิดเห็นนี้จาก @abarnert ที่ฉลาดเป็นพิเศษทำให้ฉันคิดว่า: มีสองวิธีในการทำเช่นนั้น แต่พวกเขาทั้งหมดน่าเกลียดมากและไม่ควรทำ วิธีที่น่าเกลียดอย่างน้อยที่สุดก็คือการแทนที่ codeวัตถุภายในฟังก์ชั่นด้วยอันที่มีco_consts รายการต่างกัน ถัดไปอาจจะเข้าถึง C API เพื่อเข้าถึงบัฟเฟอร์ภายในของ str [ ... ] ดังนั้นดูเหมือนว่าเป็นไปได้จริง นี่คือวิธีที่ไร้เดียงสาของฉันในการเข้าถึงปัญหานี้: >>> import inspect …

6
เหตุใดจึงมีคำสั่งในพจนานุกรมและตั้งค่าเอง?
ฉันไม่เข้าใจว่าการวนลูปมากกว่าพจนานุกรมหรือชุดในไพ ธ อนนั้นทำตามคำสั่ง 'ตามอำเภอใจ' อย่างไร ฉันหมายถึงมันเป็นภาษาการเขียนโปรแกรมดังนั้นทุกอย่างในภาษาจะต้องถูกกำหนด 100% ถูกต้องหรือไม่ Python จะต้องมีอัลกอริทึมบางอย่างที่ตัดสินใจว่าส่วนใดของพจนานุกรมหรือชุดที่เลือกคืออันดับที่หนึ่งวินาทีและอื่น ๆ ฉันพลาดอะไรไป

7
ค้นหารหัสต้นฉบับสำหรับฟังก์ชั่น Python ในตัวหรือไม่
มีวิธีดูว่าฟังก์ชั่นบิวด์อินทำงานอย่างไรในไพ ธ อน? ฉันไม่ได้หมายถึงวิธีการใช้พวกเขา แต่พวกเขาสร้างอย่างไรรหัสที่อยู่เบื้องหลังการเรียงลำดับหรือการแจกแจงฯลฯ คืออะไร?

3
อะไรทำให้ [* a] แสดงผลโดยรวม
เห็นได้ชัดว่าlist(a)ไม่รวม overallocate, [x for x in a]overallocates ในบางจุดและ[*a]overallocates ตลอดเวลา ? นี่คือขนาด n จาก 0 ถึง 12 และขนาดผลลัพธ์เป็นไบต์สำหรับวิธีการสามวิธี: 0 56 56 56 1 64 88 88 2 72 88 96 3 80 88 104 4 88 88 112 5 96 120 120 6 104 120 128 7 112 120 136 8 …

3
เหตุใดการวนซ้ำบนสตริงขนาดเล็กจึงช้ากว่ารายการขนาดเล็ก
ฉันกำลังเล่นกับเวลาและสังเกตว่าการทำความเข้าใจรายการอย่างง่ายบนสตริงขนาดเล็กใช้เวลานานกว่าการดำเนินการแบบเดียวกันกับรายการสตริงอักขระเดี่ยวขนาดเล็ก คำอธิบายใด ๆ เป็นเวลาเกือบ 1.35 เท่า >>> from timeit import timeit >>> timeit("[x for x in 'abc']") 2.0691067844831528 >>> timeit("[x for x in ['a', 'b', 'c']]") 1.5286479570345861 เกิดอะไรขึ้นในระดับล่างที่ทำให้เกิดสิ่งนี้

1
เหตุใด str.translate จึงเร็วกว่าใน Python 3.5 มากเมื่อเทียบกับ Python 3.4
ฉันพยายามลบอักขระที่ไม่ต้องการออกจากสตริงที่กำหนดโดยใช้text.translate()ใน Python 3.4 รหัสขั้นต่ำคือ: import sys s = 'abcde12345@#@$#%$' mapper = dict.fromkeys(i for i in range(sys.maxunicode) if chr(i) in '@#$') print(s.translate(mapper)) มันทำงานได้ตามที่คาดไว้ อย่างไรก็ตามโปรแกรมเดียวกันเมื่อรันใน Python 3.4 และ Python 3.5 ให้ความแตกต่างกันมาก รหัสในการคำนวณเวลาคือ python3 -m timeit -s "import sys;s = 'abcde12345@#@$#%$'*1000 ; mapper = dict.fromkeys(i for i in range(sys.maxunicode) if chr(i) in '@#$'); …

2
Python เพิ่มประสิทธิภาพตัวแปรที่ใช้เป็นค่าส่งคืนหรือไม่?
มีความแตกต่างขั้นสูงสุดระหว่างสองข้อมูลโค้ดต่อไปนี้หรือไม่? ขั้นแรกกำหนดค่าให้กับตัวแปรในฟังก์ชันแล้วส่งกลับตัวแปรนั้น ฟังก์ชันที่สองเพียงแค่ส่งกลับค่าโดยตรง Python เปลี่ยนให้เป็น bytecode ที่เท่ากันหรือไม่? หนึ่งในนั้นเร็วกว่าหรือไม่? กรณีที่ 1 : def func(): a = 42 return a กรณีที่ 2 : def func(): return 42


4
เหตุใดสิ่งที่เพิ่มขึ้นจึงใช้พื้นที่ในหน่วยความจำน้อยกว่ารายการ
A tupleใช้พื้นที่หน่วยความจำน้อยลงใน Python: >>> a = (1,2,3) >>> a.__sizeof__() 48 ในขณะที่lists ใช้พื้นที่หน่วยความจำมากกว่า: >>> b = [1,2,3] >>> b.__sizeof__() 64 เกิดอะไรขึ้นภายในการจัดการหน่วยความจำ Python

7
จะลบล้างการดำเนินการคัดลอก / deepcopy สำหรับวัตถุ Python ได้อย่างไร
ฉันเข้าใจความแตกต่างระหว่างcopyเทียบกับdeepcopyในโมดูลการคัดลอก ฉันเคยใช้มาก่อนcopy.copyและcopy.deepcopyประสบความสำเร็จ แต่นี่เป็นครั้งแรกที่ฉันได้ใช้งาน__copy__และ__deepcopy__วิธีการมากเกินไป ฉัน Googled แล้วรอบ ๆ และมองผ่านโมดูลในตัวงูหลามที่จะมองหาอินสแตนซ์ของ__copy__และ__deepcopy__ฟังก์ชั่น (เช่นsets.py, decimal.pyและfractions.py) แต่ฉันยังคงไม่แน่ใจ 100% ผมเคยได้มันขวา นี่คือสถานการณ์ของฉัน: ฉันมีวัตถุการกำหนดค่า ในขั้นต้นฉันจะสร้างอินสแตนซ์วัตถุการกำหนดค่าหนึ่งรายการด้วยชุดค่าเริ่มต้น การกำหนดค่านี้จะถูกส่งต่อไปยังวัตถุอื่น ๆ หลายรายการ (เพื่อให้แน่ใจว่าวัตถุทั้งหมดเริ่มต้นด้วยการกำหนดค่าเดียวกัน) อย่างไรก็ตามเมื่อการโต้ตอบกับผู้ใช้เริ่มต้นขึ้นแต่ละออบเจ็กต์จะต้องปรับแต่งการกำหนดค่าโดยอิสระโดยไม่ส่งผลกระทบต่อการกำหนดค่าของกันและกัน (ซึ่งบอกว่าฉันจะต้องสร้าง deepcopys ของการกำหนดค่าเริ่มต้นของฉันเพื่อส่งต่อ) นี่คือวัตถุตัวอย่าง: class ChartConfig(object): def __init__(self): #Drawing properties (Booleans/strings) self.antialiased = None self.plot_style = None self.plot_title = None self.autoscale = None #X axis properties (strings/ints) self.xaxis_title = …

4
เมื่อใดที่ hash (n) == n ใน Python
ฉันได้รับเล่นกับงูหลามของฟังก์ชันแฮช สำหรับจำนวนเต็มขนาดเล็กจะปรากฏhash(n) == nเสมอ อย่างไรก็ตามสิ่งนี้ไม่ได้ครอบคลุมถึงจำนวนมาก: >>> hash(2**100) == 2**100 False ฉันไม่แปลกใจเลยฉันเข้าใจว่าแฮชมีค่าที่ จำกัด ช่วงนั้นคืออะไร? ฉันลองใช้การค้นหาแบบไบนารีเพื่อค้นหาจำนวนที่น้อยที่สุดhash(n) != n >>> import codejamhelpers # pip install codejamhelpers >>> help(codejamhelpers.binary_search) Help on function binary_search in module codejamhelpers.binary_search: binary_search(f, t) Given an increasing function :math:`f`, find the greatest non-negative integer :math:`n` such that :math:`f(n) \le t`. …

1
ทำไมทูเปิล (set ([1,“ a”,“ b”,“ c”,“ z”,“ f”])) == tuple (set ([“ a”,“ b”,“ c”, “ z”,“ f”, 1])) 85% ของเวลาที่เปิดใช้งานการสุ่มแฮช?
เมื่อได้รับคำตอบของ Zero Piraeus สำหรับคำถามอื่นเรามีสิ่งนั้น x = tuple(set([1, "a", "b", "c", "z", "f"])) y = tuple(set(["a", "b", "c", "z", "f", 1])) print(x == y) พิมพ์Trueประมาณ 85% ของเวลาที่เปิดใช้งานการสุ่มแฮช ทำไมถึง 85%?

2
ไฟล์. pyc จะรีเฟรชเมื่อใด
ฉันเข้าใจว่าไฟล์ ".pyc" เป็นไฟล์ ".py" เวอร์ชันคอมไพล์ซึ่งสร้างขึ้นที่รันไทม์เพื่อให้โปรแกรมทำงานได้เร็วขึ้น อย่างไรก็ตามฉันสังเกตเห็นบางสิ่ง: เมื่อแก้ไขไฟล์ "py" พฤติกรรมของโปรแกรมจะเปลี่ยนไป สิ่งนี้บ่งชี้ว่าไฟล์ "py" ได้รับการคอมไพล์แล้วหรืออย่างน้อยก็ผ่านกระบวนการแฮชบางประเภทหรือเปรียบเทียบการประทับเวลาเพื่อที่จะบอกได้ว่าควรจะคอมไพล์ใหม่ เมื่อลบไฟล์ ".pyc" ทั้งหมด ( rm *.pyc) บางครั้งพฤติกรรมของโปรแกรมจะเปลี่ยนไป ซึ่งจะแสดงว่าไม่มีการคอมไพล์ในการอัปเดต ".py" คำถาม: พวกเขาตัดสินใจอย่างไรเมื่อจะรวบรวม? มีวิธีตรวจสอบที่เข้มงวดมากขึ้นในระหว่างการพัฒนาหรือไม่?

3
เหตุใดสูงสุดจึงช้ากว่าการเรียงลำดับ
ฉันพบว่าmaxช้ากว่าsortฟังก์ชันใน Python 2 และ 3 Python 2 $ python -m timeit -s 'import random;a=range(10000);random.shuffle(a)' 'a.sort();a[-1]' 1000 loops, best of 3: 239 usec per loop $ python -m timeit -s 'import random;a=range(10000);random.shuffle(a)' 'max(a)' 1000 loops, best of 3: 342 usec per loop Python 3 $ python3 -m timeit -s 'import random;a=list(range(10000));random.shuffle(a)' …

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