Quickly convert strings to number types.
Project description
Convert strings to numbers quickly.
Source Code: https://github.com/SethMMorton/fastnumbers
Downloads: https://pypi.python.org/pypi/fastnumbers
Documentation: http://pythonhosted.org//fastnumbers/
This module is a Python C extension that will convert strings to numbers much faster than can be done using pure Python. Additionally, if the string cannot be converted, instead of a ValueError the return value can be either the input as-is or a default value.
To achieve this, the module makes some assumptions about the input type (input is int (or long), float, or str (or unicode)), and otherwise a TypeError is raised.
NOTE: The old safe_real, safe_float, safe_int, and safe_forceint functions are deprecated as of fastnumbers version >= 0.3.0; fast_real, fast_float, fast_int, and fast_forceint have each been reimplemented to fall back on the “safe” algorithm if overflow or loss of precision is detected and so the separate “safe” functions are no longer needed.
Examples
fastnumbers is essentially a fast C implementation of the following Pure Python function:
def fast_float(input, raise_on_invalid=False, default=None):
try:
return float(input)
except ValueError:
if raise_on_invalid:
raise
return default if default is not None else input
Some example usage:
>>> from fastnumbers import fast_float
>>> # Convert string to a float
>>> fast_float('56.07')
56.07
>>> # Unconvertable string returned as-is by default
>>> fast_float('bad input')
'bad input'
>>> # Unconvertable strings can trigger a default value
>>> fast_float('bad input', default=0)
0
>>> # 'default' is also the first optional positional arg
>>> fast_float('bad input', 0)
0
>>> # Integers are converted to floats
>>> fast_float(54)
54.0
>>> # The default built-in float behavior can be triggered with
>>> # "raise_on_invalid" set to True.
>>> fast_float('bad input', raise_on_invalid=True) #doctest: +IGNORE_EXCEPTION_DETAIL
Traceback (most recent call last):
...
ValueError: invalid literal for float(): bad input
>>> # Single unicode characters can be converted.
>>> fast_float(u'\u2164') # Roman numeral 5 (V)
5.0
>>> fast_float(u'\u2466') # 7 enclosed in a circle
7.0
NOTE: If you need locale-dependent conversions, supply the fastnumbers function of your choice to locale.atof.
import locale
locale.setlocale(locale.LC_ALL, 'de_DE.UTF-8')
print(atof('468,5', func=fast_float)) # Prints 468.5
Timing
Just how much faster is fastnumbers than a pure python implementation? Below are the timing results for the *_float functions; please see the Timing Documentation for details into all timing results.
from timeit import timeit
float_try = '''\
def float_try(input):
"""Typical approach to this problem."""
try:
return float(input)
except ValueError:
return input
'''
float_re = '''\
import re
float_match = re.compile(r'[-+]?\d*\.?\d+(?:[eE][-+]?\d+)?$').match
def float_re(input):
"""Alternate approach to this problem."""
try:
if float_match(input):
return float(input)
else:
return input
except TypeError:
return float(input)
'''
print('Invalid input:')
print("Try:", timeit('float_try("invalid")', float_try))
print("re:", timeit('float_re("invalid")', float_re))
print("fast", timeit('fast_float("invalid")', 'from fastnumbers import fast_float'))
print()
print('Valid input:')
print("try:", timeit('float_try("56.07")', float_try))
print("re:", timeit('float_re("56.07")', float_re))
print("fast", timeit('fast_float("56.07")', 'from fastnumbers import fast_float'))
The results will be similar to the below, by vary on the system you are on:
Invalid input: Try: 2.27156710625 re: 0.570491075516 fast 0.173984050751 Valid input: try: 0.378665924072 re: 1.08740401268 fast 0.204708099365
As you can see, in all cases fastnumbers beats the pure python implementations.
Full Suite of Functions
In addition to fast_float mentioned above, there are also
fast_real
fast_int
fast_forceint
isreal
isfloat
isint
isintlike
Please see the API Documentation for full details.
History
These are the last three entries of the changelog. See the package documentation for the complete changelog.
11-01-2015 v. 0.6.2
Fixed bug that caused a SystemError exception to be raised on Python 3.5 if a very large int was passed to the “fast” functions.
10-29-2015 v. 0.6.1
Fixed segfault on Python 3.5 that seemed to be related to a change in the PyObject_CallMethod C function.
Sped up unit testing.
Added tox.ini.
10-27-2015 v. 0.6.0
Fixed issue where giving a default of None would be ignored.
Added the “nan” and “inf” options to “fast_real” and “fast_float”. These options allow alternate return values in the case of nan or inf, respectively.
Improved documentation.
Improved testing.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distributions
File details
Details for the file fastnumbers-0.6.2.zip
.
File metadata
- Download URL: fastnumbers-0.6.2.zip
- Upload date:
- Size: 61.7 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | 23c6e2251adfa2e2119222e3420d6f98ac04b56f1268a9debac1ce14cfaf938c |
|
MD5 | 35c8059de57e7005325336ad02d71dd8 |
|
BLAKE2b-256 | a0b02bc0a5f307e713dda7f9651becb766206c34ba72abe0a75b649ed6b14592 |
File details
Details for the file fastnumbers-0.6.2.tar.gz
.
File metadata
- Download URL: fastnumbers-0.6.2.tar.gz
- Upload date:
- Size: 45.6 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | a5088c9d92d6e5b31140a71615b5b0f47cc8fc5e376dd1eea48e8b9f8f2e28b0 |
|
MD5 | e97d5f3d927145eb47da06fd776c9e7a |
|
BLAKE2b-256 | f3e8207806fb49403f6352b20f2ee84ff66057eda2444e6127018326e40e24bf |