เหมือนคนอื่น ๆ ที่กล่าวถึงป๊อปและเดมีวิธีที่มีประสิทธิภาพในการลบรายการของดัชนีได้รับ แต่เพื่อประโยชน์ในการสำเร็จ (เนื่องจากสามารถทำสิ่งเดียวกันได้หลายวิธีใน Python):
การใช้สไลซ์ (สิ่งนี้ไม่ได้แทนที่การลบไอเท็มจากรายการดั้งเดิม):
(และนี่จะเป็นวิธีที่มีประสิทธิภาพน้อยที่สุดเมื่อทำงานกับรายการ Python แต่อาจมีประโยชน์ (แต่ไม่ได้ผลฉันขอย้ำอีกครั้ง) เมื่อทำงานกับวัตถุที่ผู้ใช้กำหนดซึ่งไม่สนับสนุนป๊อป แต่ให้นิยาม__getitem__
):
>>> a = [1, 2, 3, 4, 5, 6]
>>> index = 3 # Only positive index
>>> a = a[:index] + a[index+1 :]
# a is now [1, 2, 3, 5, 6]
หมายเหตุ:โปรดทราบว่าวิธีการนี้ไม่ได้ปรับเปลี่ยนรายการในสถานที่เช่นและpop
del
มันทำสำเนาสองรายการ (หนึ่งจากจุดเริ่มต้นจนถึงดัชนี แต่ไม่มี ( a[:index]
) และหนึ่งหลังดัชนีจนถึงองค์ประกอบสุดท้าย ( a[index+1:]
) และสร้างวัตถุรายการใหม่โดยการเพิ่มทั้งสองอย่าง สิ่งนี้ถูกกำหนดใหม่ให้กับตัวแปรรายการ ( a
) รายการวัตถุเก่าจึงถูกยกเลิกการลงทะเบียนและด้วยเหตุนี้จึงเก็บรวบรวมขยะ (หากวัตถุรายการดั้งเดิมไม่ได้ถูกอ้างอิงโดยตัวแปรใด ๆ นอกเหนือจาก a)
วิธีนี้ทำให้วิธีนี้ไม่มีประสิทธิภาพมากและยังสามารถสร้างผลข้างเคียงที่ไม่พึงประสงค์ (โดยเฉพาะเมื่อตัวแปรอื่น ๆ ชี้ไปที่วัตถุรายการดั้งเดิมซึ่งยังคงไม่ถูกแก้ไข)
ขอบคุณ @MarkDickinson ที่ชี้เรื่องนี้ ...
นี้คำตอบที่กองมากเกินอธิบายแนวคิดของการหั่น
นอกจากนี้โปรดทราบว่าวิธีนี้ใช้ได้กับดัชนีที่เป็นบวกเท่านั้น
ในขณะที่ใช้กับวัตถุ__getitem__
วิธีการนั้นจะต้องได้รับการกำหนดและที่สำคัญกว่านั้น__add__
จะต้องมีการกำหนดวิธีการที่จะกลับวัตถุที่มีรายการจากทั้งตัวถูกดำเนินการ
ในสาระสำคัญนี้ทำงานกับวัตถุใด ๆ ที่มีความหมายระดับ:
class foo(object):
def __init__(self, items):
self.items = items
def __getitem__(self, index):
return foo(self.items[index])
def __add__(self, right):
return foo( self.items + right.items )
งานนี้ใช้list
กำหนด__getitem__
และ__add__
วิธีการใด
การเปรียบเทียบทั้งสามวิธีในแง่ของประสิทธิภาพ:
สมมติว่าสิ่งต่อไปนี้ถูกกำหนดไว้ล่วงหน้า:
a = range(10)
index = 3
del object[index]
วิธีการ:
โดยวิธีการที่มีประสิทธิภาพที่สุด การทำงานจะวัตถุทั้งหมดที่กำหนด__del__
วิธีการ
ถอดชิ้นส่วนดังต่อไปนี้:
รหัส:
def del_method():
global a
global index
del a[index]
ถอดชิ้นส่วน:
10 0 LOAD_GLOBAL 0 (a)
3 LOAD_GLOBAL 1 (index)
6 DELETE_SUBSCR # This is the line that deletes the item
7 LOAD_CONST 0 (None)
10 RETURN_VALUE
None
pop
วิธี:
มันมีประสิทธิภาพน้อยกว่าวิธีการ del และใช้เมื่อคุณต้องการรับรายการที่ถูกลบ
รหัส:
def pop_method():
global a
global index
a.pop(index)
ถอดชิ้นส่วน:
17 0 LOAD_GLOBAL 0 (a)
3 LOAD_ATTR 1 (pop)
6 LOAD_GLOBAL 2 (index)
9 CALL_FUNCTION 1
12 POP_TOP
13 LOAD_CONST 0 (None)
16 RETURN_VALUE
ชิ้นและเพิ่มวิธีการ
มีประสิทธิภาพน้อยที่สุด
รหัส:
def slice_method():
global a
global index
a = a[:index] + a[index+1:]
ถอดชิ้นส่วน:
24 0 LOAD_GLOBAL 0 (a)
3 LOAD_GLOBAL 1 (index)
6 SLICE+2
7 LOAD_GLOBAL 0 (a)
10 LOAD_GLOBAL 1 (index)
13 LOAD_CONST 1 (1)
16 BINARY_ADD
17 SLICE+1
18 BINARY_ADD
19 STORE_GLOBAL 0 (a)
22 LOAD_CONST 0 (None)
25 RETURN_VALUE
None
หมายเหตุ: return None
ในทั้งสามลอกละเว้นสองบรรทัดสุดท้ายซึ่งโดยทั่วไปมี นอกจากนี้ยังมีสองบรรทัดแรกมีการโหลดค่าระดับโลกและa
index
O(n)
การดำเนินการเวลาdeque()
ให้การดำเนินงานที่มีประสิทธิภาพทั้งสองด้าน แต่ไม่มีการแทรก / ค้นหา / ลบ O (1) ที่อยู่ตรงกลาง