ฉันแค่ทดสอบความเร็วของวิธีการต่อ / การแทนที่สตริงแบบต่างๆด้วยความอยากรู้อยากเห็น การค้นหาโดย Google ในหัวข้อนี้ทำให้ฉันมาที่นี่ ฉันคิดว่าฉันจะโพสต์ผลการทดสอบของฉันด้วยความหวังว่าอาจช่วยให้ใครบางคนตัดสินใจได้
import timeit
def percent_():
return "test %s, with number %s" % (1,2)
def format_():
return "test {}, with number {}".format(1,2)
def format2_():
return "test {1}, with number {0}".format(2,1)
def concat_():
return "test " + str(1) + ", with number " + str(2)
def dotimers(func_list):
for func in func_list:
tmr = timeit.Timer(func)
res = tmr.timeit()
print "test " + func.func_name + ": " + str(res)
def runtests(func_list, runs=5):
for i in range(runs):
print "----------- TEST #" + str(i + 1)
dotimers(func_list)
... หลังจากรันruntests((percent_, format_, format2_, concat_), runs=5)
ฉันพบว่า% method เร็วกว่าวิธีอื่น ๆ ในสตริงเล็ก ๆ เหล่านี้ประมาณสองเท่า วิธี concat ช้าที่สุดเสมอ (แทบจะไม่) มีความแตกต่างเล็กน้อยมากเมื่อเปลี่ยนตำแหน่งในไฟล์format()
วิธีนี้ แต่การสลับตำแหน่งมักจะช้ากว่าวิธีการจัดรูปแบบปกติอย่างน้อย. 01
ตัวอย่างผลการทดสอบ:
test concat_() : 0.62 (0.61 to 0.63)
test format_() : 0.56 (consistently 0.56)
test format2_() : 0.58 (0.57 to 0.59)
test percent_() : 0.34 (0.33 to 0.35)
ฉันเรียกใช้สิ่งเหล่านี้เนื่องจากฉันใช้การต่อสตริงในสคริปต์ของฉันและฉันสงสัยว่าค่าใช้จ่ายคืออะไร ฉันใช้คำสั่งต่างๆเพื่อให้แน่ใจว่าไม่มีสิ่งใดรบกวนหรือได้รับประสิทธิภาพที่ดีขึ้นเป็นอันดับแรกหรือครั้งสุดท้าย ในบันทึกด้านข้างฉันโยนเครื่องกำเนิดสตริงที่ยาวกว่าเข้าไปในฟังก์ชั่นเหล่านั้นเช่น"%s" + ("a" * 1024)
และ concat ปกติเร็วกว่าการใช้format
และ%
วิธีการ ฉันเดาว่ามันขึ้นอยู่กับสตริงและสิ่งที่คุณพยายามจะบรรลุ หากประสิทธิภาพมีความสำคัญจริง ๆ อาจเป็นการดีกว่าที่จะลองสิ่งต่างๆและทดสอบ ฉันมักจะเลือกความสามารถในการอ่านมากกว่าความเร็วเว้นแต่ความเร็วจะเป็นปัญหา แต่นั่นก็เป็นแค่ฉัน ดังนั้นไม่ชอบการคัดลอก / วางของฉันฉันต้องใส่ 8 ช่องว่างในทุกอย่างเพื่อให้มันดูถูกต้อง ฉันมักจะใช้ 4.