Skip to content

Commit b28f255

Browse files
committed
Add a example benchmark for zipped iteration.
1 parent d9443f1 commit b28f255

File tree

1 file changed

+85
-0
lines changed

1 file changed

+85
-0
lines changed

benches/iter.rs

+85
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,85 @@
1+
#![feature(test)]
2+
#![allow(deprecated)]
3+
4+
extern crate test;
5+
use test::{black_box, Bencher};
6+
7+
use ndarray::Zip;
8+
use numpy::{npyiter::NpyMultiIterBuilder, PyArray};
9+
use pyo3::Python;
10+
11+
fn numpy_iter(bencher: &mut Bencher, size: usize) {
12+
Python::with_gil(|py| {
13+
let x = PyArray::<f64, _>::zeros(py, size, false);
14+
let y = PyArray::<f64, _>::zeros(py, size, false);
15+
let z = PyArray::<f64, _>::zeros(py, size, false);
16+
17+
let x = x.readonly();
18+
let y = y.readonly();
19+
let mut z = z.readwrite();
20+
21+
bencher.iter(|| {
22+
let iter = NpyMultiIterBuilder::new()
23+
.add_readonly(black_box(&x))
24+
.add_readonly(black_box(&y))
25+
.add_readwrite(black_box(&mut z))
26+
.build()
27+
.unwrap();
28+
29+
for (x, y, z) in iter {
30+
*z = x + y;
31+
}
32+
});
33+
});
34+
}
35+
36+
#[bench]
37+
fn numpy_iter_small(bencher: &mut Bencher) {
38+
numpy_iter(bencher, 2_usize.pow(5));
39+
}
40+
41+
#[bench]
42+
fn numpy_iter_medium(bencher: &mut Bencher) {
43+
numpy_iter(bencher, 2_usize.pow(10));
44+
}
45+
46+
#[bench]
47+
fn numpy_iter_large(bencher: &mut Bencher) {
48+
numpy_iter(bencher, 2_usize.pow(15));
49+
}
50+
51+
fn ndarray_iter(bencher: &mut Bencher, size: usize) {
52+
Python::with_gil(|py| {
53+
let x = PyArray::<f64, _>::zeros(py, size, false);
54+
let y = PyArray::<f64, _>::zeros(py, size, false);
55+
let z = PyArray::<f64, _>::zeros(py, size, false);
56+
57+
let x = x.readonly();
58+
let y = y.readonly();
59+
let mut z = z.readwrite();
60+
61+
bencher.iter(|| {
62+
Zip::from(black_box(x.as_array()))
63+
.and(black_box(y.as_array()))
64+
.and(black_box(z.as_array_mut()))
65+
.for_each(|x, y, z| {
66+
*z = x + y;
67+
});
68+
});
69+
});
70+
}
71+
72+
#[bench]
73+
fn ndarray_iter_small(bencher: &mut Bencher) {
74+
ndarray_iter(bencher, 2_usize.pow(5));
75+
}
76+
77+
#[bench]
78+
fn ndarray_iter_medium(bencher: &mut Bencher) {
79+
ndarray_iter(bencher, 2_usize.pow(10));
80+
}
81+
82+
#[bench]
83+
fn ndarray_iter_large(bencher: &mut Bencher) {
84+
ndarray_iter(bencher, 2_usize.pow(15));
85+
}

0 commit comments

Comments
 (0)