ที่ดีที่สุดวิธีการผนวกสตริงเพื่อตัวแปรสตริงคือการใช้งานหรือ+
+=
นี่เป็นเพราะมันอ่านได้และรวดเร็ว พวกเขายังเร็วเหมือนกันซึ่งคนที่คุณเลือกเป็นเรื่องของรสนิยมคนหลัง ๆ นั้นเป็นคนธรรมดาที่สุด นี่คือการกำหนดเวลาด้วยtimeit
โมดูล:
a = a + b:
0.11338996887207031
a += b:
0.11040496826171875
อย่างไรก็ตามผู้ที่แนะนำให้มีรายการและผนวกเข้ากับพวกเขาและจากนั้นเข้าร่วมรายการเหล่านั้นทำเช่นนั้นเพราะการผนวกสตริงไปยังรายการนั้นน่าจะเร็วมากเมื่อเทียบกับการขยายสตริง และนี่อาจเป็นจริงในบางกรณี ตัวอย่างเช่นที่นี่คือหนึ่งล้านต่อท้ายของสตริงหนึ่งอักขระตัวแรกต่อสตริงจากนั้นไปยังรายการ:
a += b:
0.10780501365661621
a.append(b):
0.1123361587524414
ตกลงปรากฎว่าแม้สตริงผลลัพธ์จะมีความยาวหนึ่งล้านตัวอักษรการต่อท้ายก็ยังเร็วกว่า
ตอนนี้เรามาลองต่อท้ายสายอักขระยาวพันตัวต่อหนึ่งแสนครั้ง:
a += b:
0.41823482513427734
a.append(b):
0.010656118392944336
ดังนั้นสตริงสุดท้ายจึงมีความยาวประมาณ 100MB มันค่อนข้างช้าการต่อท้ายรายการเร็วกว่ามาก a.join()
ว่าระยะเวลาที่ไม่รวมสุดท้าย ดังนั้นจะใช้เวลานานเท่าไหร่?
a.join(a):
0.43739795684814453
Oups ปรากฏว่าแม้ในกรณีนี้การผนวก / เข้าร่วมจะช้าลง
ดังนั้นคำแนะนำนี้มาจากไหน? Python 2
a += b:
0.165287017822
a.append(b):
0.0132720470428
a.join(a):
0.114929914474
ดีผนวก / เข้าร่วมเป็นเล็กน้อยเร็วขึ้นมีถ้าคุณกำลังใช้สายยาวมาก (ซึ่งคุณมักจะไม่ได้สิ่งที่คุณจะมีสตริงที่ 100MB หน่วยความจำหรือไม่?)
แต่ clincher ที่แท้จริงคือ Python 2.3 ที่ฉันจะไม่แสดงเวลาให้คุณเห็นเพราะมันช้ามากจนยังไม่เสร็จ การทดสอบเหล่านี้ใช้เวลาไม่กี่นาทีไม่กี่นาทียกเว้นภาคผนวก / การเข้าร่วมซึ่งเร็วพอ ๆ กับ Pythons ในภายหลัง
ได้. การต่อสายอักขระช้ามากใน Python ย้อนกลับไปในยุคหิน แต่ใน 2.4 มันไม่ใช่อีกต่อไป (หรืออย่างน้อย Python 2.4.7) ดังนั้นคำแนะนำในการใช้ผนวก / เข้าร่วมนั้นล้าสมัยในปี 2551 เมื่อ Python 2.3 หยุดการอัปเดตและคุณควรหยุดใช้ :-)
(อัปเดต: ปรากฎเมื่อฉันทำการทดสอบอย่างระมัดระวังยิ่งขึ้นว่าการใช้+
และ+=
เร็วกว่าสำหรับสองสายใน Python 2.3 เช่นกันคำแนะนำในการใช้''.join()
จะต้องเป็นความเข้าใจผิด)
อย่างไรก็ตามนี่คือ CPython การใช้งานอื่น ๆ อาจมีข้อกังวลอื่น ๆ และนี่ก็เป็นอีกสาเหตุหนึ่งที่ทำให้การเพิ่มประสิทธิภาพก่อนวัยอันควรเป็นสาเหตุของความชั่วร้ายทั้งหมด อย่าใช้เทคนิคที่ควรจะ "เร็วกว่า" เว้นแต่คุณจะทำการวัดครั้งแรก
ดังนั้น "ดีที่สุด" รุ่นที่จะทำสตริงคือการใช้ + หรือ + = และถ้าสิ่งนั้นกลายเป็นว่าช้าสำหรับคุณซึ่งไม่น่าจะเป็นไปได้ให้ทำอย่างอื่น
เหตุใดฉันจึงใช้ผนวก / เข้าร่วมจำนวนมากในรหัสของฉัน เพราะบางครั้งมันชัดเจนกว่า โดยเฉพาะอย่างยิ่งเมื่อใดก็ตามที่คุณควรต่อกันเข้าด้วยกันควรคั่นด้วยช่องว่างหรือเครื่องหมายจุลภาคหรือบรรทัดใหม่