-
Notifications
You must be signed in to change notification settings - Fork 313
/
Copy pathtest_algorithms.py
114 lines (80 loc) · 3.62 KB
/
test_algorithms.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
import random, timeit, functools, os, pytest
from pydatastructs import (OneDimensionalArray, Backend,
DynamicOneDimensionalArray, quick_sort, bubble_sort, selection_sort,
insertion_sort, is_ordered, linear_search, binary_search, jump_search, cocktail_shaker_sort)
def _test_common_sort(sort, **kwargs):
cpp = Backend.CPP
repeat = 2
number = 2
size = int(os.environ.get("PYDATASTRUCTS_BENCHMARK_SIZE", "1000"))
size = kwargs.get("size", size)
def _common(array_type, dtype, *args, **kwargs):
array = array_type(dtype, *args, **kwargs)
timer_python = timeit.Timer(functools.partial(sort, array))
python_backend = min(timer_python.repeat(repeat, number))
backend_dict = {"backend": cpp}
timer_cpp = timeit.Timer(functools.partial(sort, array, **backend_dict))
cpp_backend = min(timer_cpp.repeat(repeat, number))
assert cpp_backend < python_backend
# Case 1: int
data = [random.randint(0, 2 * size) for _ in range(size)]
_common(OneDimensionalArray, int, data, backend=cpp)
# Case 3: float
data = [random.random() * 2 * size for _ in range(size)]
_common(OneDimensionalArray, float, data, backend=cpp)
@pytest.mark.xfail
def test_quick_sort():
_test_common_sort(quick_sort, size=4000)
@pytest.mark.xfail
def test_bubble_sort():
_test_common_sort(bubble_sort, size=2000)
@pytest.mark.xfail
def test_selection_sort():
_test_common_sort(selection_sort, size=2000)
@pytest.mark.xfail
def test_insertion_sort():
_test_common_sort(insertion_sort, size=2000)
@pytest.mark.xfail
def test_cocktail_shaker_sort():
_test_common_sort(cocktail_shaker_sort, size=2000)
@pytest.mark.xfail
def test_is_ordered():
cpp = Backend.CPP
repeat = 2
number = 2
size = int(os.environ.get("PYDATASTRUCTS_BENCHMARK_SIZE", "4000"))
def _common(array_type, dtype, *args, **kwargs):
array = array_type(dtype, *args, **kwargs)
timer_python = timeit.Timer(functools.partial(is_ordered, array))
python_backend = min(timer_python.repeat(repeat, number))
backend_dict = {"backend": cpp}
timer_cpp = timeit.Timer(functools.partial(is_ordered, array,
**backend_dict))
cpp_backend = min(timer_cpp.repeat(repeat, number))
assert cpp_backend < python_backend
# Case 1: int
data = [random.randint(0, 2 * size) for _ in range(size)]
_common(OneDimensionalArray, int, data, backend=cpp)
# Case 3: float
data = [random.random() * 2 * size for _ in range(size)]
_common(OneDimensionalArray, float, data, backend=cpp)
@pytest.mark.xfail
def test_search():
cpp = Backend.CPP
repeat = 2
number = 2
size = int(os.environ.get("PYDATASTRUCTS_BENCHMARK_SIZE", "4000"))
def _common(search_func, array_type, dtype, *args, **kwargs):
array = array_type(dtype, *args, **kwargs)
timer_python = timeit.Timer(functools.partial(search_func, array, array[size-1]))
python_backend = min(timer_python.repeat(repeat, number))
backend_dict = {"backend": cpp}
timer_cpp = timeit.Timer(functools.partial(search_func, array, array[size-1],
**backend_dict))
cpp_backend = min(timer_cpp.repeat(repeat, number))
assert cpp_backend < python_backend
# Case 1: int
data = [random.randint(0, 2 * size) for _ in range(size)]
_common(linear_search, OneDimensionalArray, int, data, backend=cpp)
_common(binary_search, OneDimensionalArray, int, data, backend=cpp)
_common(jump_search, OneDimensionalArray, int, data, backend=cpp)