Jeśli zależy Ci na wydajności (i nie sugeruję, że powinieneś), podejście oparte na próbach jest wyraźnym zwycięzcą (w porównaniu z podejściem opartym na partycjach lub wyrażeniem regularnym), o ile nie spodziewasz się dużo niepoprawne ciągi, w którym to przypadku jest to potencjalnie wolniejsze (prawdopodobnie ze względu na koszt obsługi wyjątków).
Ponownie, nie sugeruję, abyś dbał o wydajność, po prostu podałbym dane na wypadek, gdybyś robił to 10 miliardów razy na sekundę, czy coś takiego. Ponadto kod oparty na partycjach nie obsługuje co najmniej jednego prawidłowego ciągu.
$ ./floatstr.py
FA..
smutna partycja: 3.1102449894
partycja szczęśliwa: 2.09208488464
..
re sad: 7.76906108856
ponownie szczęśliwy: 7.09421992302
..
spróbuj smutny: 12.1525540352
spróbuj szczęśliwy: 1.44165301323
.
================================================== ====================
FAIL: test_partition (__main __. ConvertTests)
-------------------------------------------------- --------------------
Traceback (ostatnie połączenie ostatnio):
Plik „./floatstr.py”, wiersz 48, w partycji testowej
self.failUnless (is_float_partition („20e2”))
AssertionError
-------------------------------------------------- --------------------
Przebiegł 8 testów w 33,670s
FAILED (awarie = 1)
Oto kod (Python 2.6, REGEXP zaczerpnięte z Johna Gietzen za odpowiedź ):
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)?$")
def is_float_re(str):
return re.match(_float_regexp, str)
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 pa\
rtition[2].isdigit()) or (partition[0].isdigit() and partition[1]=='.' and partition[2]==''):
return True
if __name__ == '__main__':
import unittest
import timeit
class ConvertTests(unittest.TestCase):
def test_re(self):
self.failUnless(is_float_re("20e2"))
def test_try(self):
self.failUnless(is_float_try("20e2"))
def test_re_perf(self):
print
print 're sad:', timeit.Timer('floatstr.is_float_re("12.2x")', "import floatstr").timeit()
print 're happy:', timeit.Timer('floatstr.is_float_re("12.2")', "import floatstr").timeit()
def test_try_perf(self):
print
print 'try sad:', timeit.Timer('floatstr.is_float_try("12.2x")', "import floatstr").timeit()
print 'try happy:', timeit.Timer('floatstr.is_float_try("12.2")', "import floatstr").timeit()
def test_partition_perf(self):
print
print 'partition sad:', timeit.Timer('floatstr.is_float_partition("12.2x")', "import floatstr").timeit()
print 'partition happy:', timeit.Timer('floatstr.is_float_partition("12.2")', "import floatstr").timeit()
def test_partition(self):
self.failUnless(is_float_partition("20e2"))
def test_partition2(self):
self.failUnless(is_float_partition(".2"))
def test_partition3(self):
self.failIf(is_float_partition("1234x.2"))
unittest.main()