TL; DR :
- Якщо ваш вхід - це в основному рядки, які можна перетворити на плаваючі,
try: except:
метод є найкращим нативним методом Python.
- Якщо ваш вхід - це в основному рядки, які неможливо перетворити на плавки, регулярні вирази або метод розділів будуть кращими.
- Якщо ви не впевнені в своєму вході або потребуєте більшої швидкості, і 2) не заперечуєте та можете встановити сторонне розширення C, fastnumbers працює дуже добре.
Є ще один метод, доступний через сторонній модуль під назвою fastnumbers (розкриття, я автор); він забезпечує функцію, яку називають isfloat . Я взяв єдиний тестовий приклад, викладений Джейкобом Габріельсоном у цій відповіді , але додав fastnumbers.isfloat
метод. Я також повинен зауважити, що приклад Якова не справедливо вирішив параметр регулярних виразів, оскільки більшість часу в цьому прикладі проводили в глобальних пошуках через оператора крапок ... Я змінив цю функцію, щоб дати справедливішому порівнянню 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
Як бачите, регекс насправді не такий вже й поганий, як спочатку здавалося, і якщо у вас є реальна потреба у швидкості, fastnumbers
метод досить непоганий.