Add code
This commit is contained in:
parent
20dc95f087
commit
9c15a73008
10
README.md
10
README.md
|
@ -1,3 +1,11 @@
|
||||||
# fast-stdev
|
# fast-stdev
|
||||||
|
|
||||||
Fast(er) standard deviation calculation (compared to the standard library) for Python [experimental]
|
Fast(er) standard deviation calculation (compared to the standard library) for
|
||||||
|
Python [experimental]
|
||||||
|
|
||||||
|
import fast_stdev
|
||||||
|
print(fast_stdev.stdev([1, 2, 4])) # Sample standard deviation
|
||||||
|
print(fast_stdev.pstdev([1, 2, 4])) # Population standard deviation
|
||||||
|
|
||||||
|
Run `test.py` to compare results and run times with the `statistics.[p]stdev`
|
||||||
|
functions and NumPy's `array.std`.
|
||||||
|
|
48
fast_stdev.py
Executable file
48
fast_stdev.py
Executable file
|
@ -0,0 +1,48 @@
|
||||||
|
# SPDX-License-Identifier: LGPL-3.0-or-later
|
||||||
|
|
||||||
|
import math
|
||||||
|
from typing import Sequence, Union, List
|
||||||
|
|
||||||
|
|
||||||
|
def _divide_list(
|
||||||
|
dividends: Sequence[Union[float, int]], divisor: Union[float, int]
|
||||||
|
) -> float:
|
||||||
|
return sum(dividends) / divisor
|
||||||
|
|
||||||
|
|
||||||
|
def stdev(numbers: Sequence[float]) -> float:
|
||||||
|
"""Calculate the sample standard deviation of a group of numbers
|
||||||
|
|
||||||
|
Parameters
|
||||||
|
----------
|
||||||
|
numbers : list of int or float
|
||||||
|
The numbers to calculate the mean of
|
||||||
|
|
||||||
|
Returns
|
||||||
|
-------
|
||||||
|
float
|
||||||
|
The sample standard deviation of the numbers
|
||||||
|
|
||||||
|
"""
|
||||||
|
mean = _divide_list(numbers, len(numbers))
|
||||||
|
squared_deviations = [(mean - i) ** 2 for i in numbers]
|
||||||
|
return math.sqrt(_divide_list(squared_deviations, len(numbers) - 1))
|
||||||
|
|
||||||
|
|
||||||
|
def pstdev(numbers: Sequence[float]) -> float:
|
||||||
|
"""Calculate the population standard deviation of a group of numbers
|
||||||
|
|
||||||
|
Parameters
|
||||||
|
----------
|
||||||
|
numbers : list of int or float
|
||||||
|
The numbers to calculate the mean of
|
||||||
|
|
||||||
|
Returns
|
||||||
|
-------
|
||||||
|
float
|
||||||
|
The population standard deviation of the numbers
|
||||||
|
|
||||||
|
"""
|
||||||
|
mean = _divide_list(numbers, len(numbers))
|
||||||
|
squared_deviations = [(mean - i) ** 2 for i in numbers]
|
||||||
|
return math.sqrt(_divide_list(squared_deviations, len(numbers)))
|
69
test.py
Normal file
69
test.py
Normal file
|
@ -0,0 +1,69 @@
|
||||||
|
import timeit
|
||||||
|
import statistics
|
||||||
|
import fast_stdev
|
||||||
|
import random
|
||||||
|
import numpy
|
||||||
|
import sys
|
||||||
|
|
||||||
|
print("Python", sys.version, "\n")
|
||||||
|
|
||||||
|
iterations = 1000
|
||||||
|
numbers = [1, 2, 4]
|
||||||
|
numbers = [random.randint(1, 100) for i in range(1000)]
|
||||||
|
numbers = [random.random() for i in range(1000)]
|
||||||
|
np_array = numpy.array(numbers)
|
||||||
|
|
||||||
|
|
||||||
|
def time(code):
|
||||||
|
time = round(
|
||||||
|
1000000
|
||||||
|
* timeit.timeit(
|
||||||
|
code,
|
||||||
|
number=iterations,
|
||||||
|
globals=globals(),
|
||||||
|
)
|
||||||
|
/ iterations
|
||||||
|
)
|
||||||
|
|
||||||
|
return "(time: " + (str(time)).rjust(4, " ") + "μs)"
|
||||||
|
|
||||||
|
|
||||||
|
print("Sample standard deviation:")
|
||||||
|
|
||||||
|
print(
|
||||||
|
" stdlib : "
|
||||||
|
+ str(statistics.stdev(numbers)).ljust(20, " ")
|
||||||
|
+ time("statistics.stdev(numbers)")
|
||||||
|
)
|
||||||
|
|
||||||
|
print(
|
||||||
|
" fast_stdev : "
|
||||||
|
+ str(fast_stdev.stdev(numbers)).ljust(20, " ")
|
||||||
|
+ time("fast_stdev.stdev(numbers)")
|
||||||
|
)
|
||||||
|
|
||||||
|
print(
|
||||||
|
" numpy : "
|
||||||
|
+ str(np_array.std(ddof=1)).ljust(20, " ")
|
||||||
|
+ time("np_array.std(ddof=1)")
|
||||||
|
)
|
||||||
|
|
||||||
|
print("\nPopulation standard deviation:")
|
||||||
|
|
||||||
|
print(
|
||||||
|
" stdlib : "
|
||||||
|
+ str(statistics.pstdev(numbers)).ljust(20, " ")
|
||||||
|
+ time("statistics.pstdev(numbers)")
|
||||||
|
)
|
||||||
|
|
||||||
|
print(
|
||||||
|
" fast_stdev : "
|
||||||
|
+ str(fast_stdev.pstdev(numbers)).ljust(20, " ")
|
||||||
|
+ time("fast_stdev.pstdev(numbers)")
|
||||||
|
)
|
||||||
|
|
||||||
|
print(
|
||||||
|
" numpy : "
|
||||||
|
+ str(np_array.std()).ljust(20, " ")
|
||||||
|
+ time("np_array.std()")
|
||||||
|
)
|
Loading…
Reference in New Issue
Block a user