-
Notifications
You must be signed in to change notification settings - Fork 23
Expand file tree
/
Copy pathtest_speed.py
More file actions
170 lines (138 loc) · 5.81 KB
/
Copy pathtest_speed.py
File metadata and controls
170 lines (138 loc) · 5.81 KB
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
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
import multiprocessing
import sys
import pytest
import matplotlib as mpl
from matplotlib.figure import Figure
import numpy as np
from matplotlib.backends.backend_agg import FigureCanvasAgg
import mplcairo
from mplcairo import _mplcairo, antialias_t
from mplcairo.base import FigureCanvasCairo
# Import an autouse fixture.
from matplotlib.testing.conftest import mpl_test_settings
_canvas_classes = [FigureCanvasAgg, FigureCanvasCairo]
@pytest.mark.parametrize(
"buf_name", ["random_alpha", "alpha_rows", "opaque"])
def test_cairo_to_straight_rgba8888(benchmark, buf_name):
assert sys.byteorder == "little" # BGRA8888
buf = np.random.RandomState(0).randint(
0x100, size=(256, 256, 4), dtype=np.uint8)
if buf_name == "random_alpha":
buf[..., :3] = buf[..., :3] * (buf[..., 3:] / 0xff)
s = 29756813
elif buf_name == "alpha_rows": # Repeatedly use the same alpha values.
buf[..., 3] = np.arange(256)[:, None]
buf[..., :3] = buf[..., :3] * (buf[..., 3:] / 0xff)
s = 29752202
elif buf_name == "opaque":
buf[..., 3] = 0xff
s = 41774594
else:
assert False
benchmark(_mplcairo.cairo_to_straight_rgba8888, buf)
assert _mplcairo.cairo_to_straight_rgba8888(buf).sum() == s
@pytest.fixture
def axes():
mpl.rcdefaults()
mplcairo.set_options(cairo_circles=True, raqm=False)
return Figure().subplots()
def despine(ax):
ax.set(xticks=[], yticks=[])
for spine in ax.spines.values():
spine.set_visible(False)
@pytest.fixture
def sample_vectors():
return np.random.RandomState(0).random_sample((2, 10000))
@pytest.fixture
def sample_image():
return np.random.RandomState(0).random_sample((100, 100))
@pytest.mark.parametrize("canvas_cls", _canvas_classes)
def test_axes(benchmark, axes, canvas_cls):
axes.figure.canvas = canvas_cls(axes.figure)
benchmark(axes.figure.canvas.draw)
@pytest.mark.parametrize(
"canvas_cls,antialiased",
[(FigureCanvasAgg, False),
(FigureCanvasAgg, True),
(FigureCanvasCairo, antialias_t.NONE),
(FigureCanvasCairo, antialias_t.GRAY),
(FigureCanvasCairo, antialias_t.SUBPIXEL),
(FigureCanvasCairo, antialias_t.FAST),
(FigureCanvasCairo, antialias_t.GOOD),
(FigureCanvasCairo, antialias_t.BEST)])
@pytest.mark.parametrize("joinstyle", ["miter", "round", "bevel"])
def test_line(
benchmark, axes, sample_vectors, canvas_cls, antialiased, joinstyle):
with mpl.rc_context({"agg.path.chunksize": 0}):
axes.plot(*sample_vectors,
antialiased=antialiased, solid_joinstyle=joinstyle)
despine(axes)
axes.figure.canvas = canvas_cls(axes.figure)
benchmark(axes.figure.canvas.draw)
# For the marker tests, try both square and round markers, as we have a special
# code path for circles which may not be representative of general performance.
_marker_test_parametrization = pytest.mark.parametrize(
"canvas_cls, threshold, marker, marker_threads, cairo_circles", [
(FigureCanvasAgg, 0, "o", 0, False),
(FigureCanvasAgg, 0, "s", 0, False),
(FigureCanvasCairo, 0, "o", 0, False),
(FigureCanvasCairo, 0, "o", 0, True),
(FigureCanvasCairo, 0, "s", 0, False),
(FigureCanvasCairo, 1/8, "o", 0, False),
(FigureCanvasCairo, 1/8, "o", 0, True),
(FigureCanvasCairo, 1/8, "s", 0, False),
(FigureCanvasCairo, 1/8, "o", 1, False),
(FigureCanvasCairo, 1/8, "o", 1, True),
(FigureCanvasCairo, 1/8, "s", 1, False),
(FigureCanvasCairo, 1/8, "o", multiprocessing.cpu_count() - 1, False),
(FigureCanvasCairo, 1/8, "o", multiprocessing.cpu_count() - 1, True),
(FigureCanvasCairo, 1/8, "s", multiprocessing.cpu_count() - 1, False),
]
)
@_marker_test_parametrization
def test_markers(
benchmark, axes, sample_vectors,
canvas_cls, threshold, marker, marker_threads, cairo_circles):
mplcairo.set_options(marker_threads=marker_threads,
cairo_circles=cairo_circles)
with mpl.rc_context({"path.simplify_threshold": threshold}):
axes.plot(*sample_vectors, linestyle="none", marker=marker)
despine(axes)
axes.figure.canvas = canvas_cls(axes.figure)
benchmark(axes.figure.canvas.draw)
mplcairo.set_options(marker_threads=0,
cairo_circles=False)
@_marker_test_parametrization
def test_scatter_multicolor(
benchmark, axes, sample_vectors,
canvas_cls, threshold, marker, marker_threads, cairo_circles):
mplcairo.set_options(marker_threads=marker_threads,
cairo_circles=cairo_circles)
with mpl.rc_context({"path.simplify_threshold": threshold}):
a, b = sample_vectors
axes.scatter(a, a, c=b, marker=marker)
despine(axes)
axes.figure.canvas = canvas_cls(axes.figure)
benchmark(axes.figure.canvas.draw)
mplcairo.set_options(marker_threads=0,
cairo_circles=False)
@_marker_test_parametrization
def test_scatter_multisize(
benchmark, axes, sample_vectors,
canvas_cls, threshold, marker, marker_threads, cairo_circles):
mplcairo.set_options(marker_threads=marker_threads,
cairo_circles=cairo_circles)
with mpl.rc_context({"path.simplify_threshold": threshold}):
a, b = sample_vectors
axes.scatter(a, a, s=100 * b ** 2, marker=marker)
despine(axes)
axes.figure.canvas = canvas_cls(axes.figure)
benchmark(axes.figure.canvas.draw)
mplcairo.set_options(marker_threads=0,
cairo_circles=False)
@pytest.mark.parametrize("canvas_cls", _canvas_classes)
def test_image(benchmark, canvas_cls, axes, sample_image):
axes.imshow(sample_image)
despine(axes)
axes.figure.canvas = canvas_cls(axes.figure)
benchmark(axes.figure.canvas.draw)