TL; DR :
- หากอินพุตของคุณส่วนใหญ่เป็นสตริงที่สามารถแปลงเป็นโฟลท
try: except:
วิธีนั้นเป็นวิธีไพ ธ อนดั้งเดิมที่ดีที่สุด
- หากอินพุตของคุณส่วนใหญ่เป็นสตริงที่ไม่สามารถแปลงเป็นแบบลอยได้นิพจน์ทั่วไปหรือวิธีการแบ่งจะดีกว่า
- หากคุณเป็น 1) ไม่แน่ใจอินพุตของคุณหรือต้องการความเร็วที่มากขึ้นและ 2) ไม่ต้องสนใจและสามารถติดตั้งส่วนขยาย C ของบุคคลที่สามfastnumbersทำงานได้ดี
มีวิธีการอื่นผ่านทางโมดูลบุคคลที่สามที่เรียกว่าfastnumbers (เปิดเผยฉันเป็นผู้เขียน); ก็มีฟังก์ชั่นที่เรียกว่าisfloat ฉันได้นำตัวอย่างที่ไม่ย่อท้อซึ่งจาค็อบกาเบรียลสรุปไว้ในคำตอบนี้แต่เพิ่มfastnumbers.isfloat
วิธีการ ฉันยังควรทราบว่าตัวอย่างของยาโคบไม่ได้ทำเพื่อความยุติธรรมตัวเลือก regex เพราะส่วนใหญ่ของเวลาในตัวอย่างที่ถูกใช้ในการค้นหาทั่วโลกเนื่องจากผู้ประกอบการจุด ... try: except:
ฉันได้แก้ไขที่ฟังก์ชั่นที่จะให้เปรียบเทียบเป็นธรรมในการ
def is_float_try(str):
try:
float(str)
return True
except ValueError:
return False
import re
_float_regexp = re.compile(r"^[-+]?(?:\b[0-9]+(?:\.[0-9]*)?|\.[0-9]+\b)(?:[eE][-+]?[0-9]+\b)?$").match
def is_float_re(str):
return True if _float_regexp(str) else False
def is_float_partition(element):
partition=element.partition('.')
if (partition[0].isdigit() and partition[1]=='.' and partition[2].isdigit()) or (partition[0]=='' and partition[1]=='.' and partition[2].isdigit()) or (partition[0].isdigit() and partition[1]=='.' and partition[2]==''):
return True
else:
return False
from fastnumbers import isfloat
if __name__ == '__main__':
import unittest
import timeit
class ConvertTests(unittest.TestCase):
def test_re_perf(self):
print
print 're sad:', timeit.Timer('ttest.is_float_re("12.2x")', "import ttest").timeit()
print 're happy:', timeit.Timer('ttest.is_float_re("12.2")', "import ttest").timeit()
def test_try_perf(self):
print
print 'try sad:', timeit.Timer('ttest.is_float_try("12.2x")', "import ttest").timeit()
print 'try happy:', timeit.Timer('ttest.is_float_try("12.2")', "import ttest").timeit()
def test_fn_perf(self):
print
print 'fn sad:', timeit.Timer('ttest.isfloat("12.2x")', "import ttest").timeit()
print 'fn happy:', timeit.Timer('ttest.isfloat("12.2")', "import ttest").timeit()
def test_part_perf(self):
print
print 'part sad:', timeit.Timer('ttest.is_float_partition("12.2x")', "import ttest").timeit()
print 'part happy:', timeit.Timer('ttest.is_float_partition("12.2")', "import ttest").timeit()
unittest.main()
บนเครื่องของฉันผลลัพธ์คือ:
fn sad: 0.220988988876
fn happy: 0.212214946747
.
part sad: 1.2219619751
part happy: 0.754667043686
.
re sad: 1.50515985489
re happy: 1.01107215881
.
try sad: 2.40243887901
try happy: 0.425730228424
.
----------------------------------------------------------------------
Ran 4 tests in 7.761s
OK
อย่างที่คุณเห็น regex ไม่ได้เลวร้ายอย่างที่มันเคยเห็นมาก่อนและถ้าคุณต้องการความเร็วที่แท้จริงfastnumbers
วิธีนี้ค่อนข้างดี