Skip to content

Commit e4c32d4

Browse files
committed
Add benchmarks for creating one-dimensional arrays.
1 parent c35b5cd commit e4c32d4

File tree

1 file changed

+143
-0
lines changed

1 file changed

+143
-0
lines changed

benches/array.rs

Lines changed: 143 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,143 @@
1+
#![feature(test)]
2+
3+
extern crate test;
4+
use test::{black_box, Bencher};
5+
6+
use std::ops::Range;
7+
8+
use numpy::PyArray1;
9+
use pyo3::{Python, ToPyObject};
10+
11+
struct Iter(Range<usize>);
12+
13+
impl Iterator for Iter {
14+
type Item = usize;
15+
16+
fn next(&mut self) -> Option<Self::Item> {
17+
self.0.next()
18+
}
19+
}
20+
21+
fn from_iter(bencher: &mut Bencher, size: usize) {
22+
bencher.iter(|| {
23+
let iter = black_box(Iter(0..size));
24+
25+
Python::with_gil(|py| {
26+
PyArray1::from_iter(py, iter);
27+
});
28+
});
29+
}
30+
31+
#[bench]
32+
fn from_iter_small(bencher: &mut Bencher) {
33+
from_iter(bencher, 2_usize.pow(5));
34+
}
35+
36+
#[bench]
37+
fn from_iter_medium(bencher: &mut Bencher) {
38+
from_iter(bencher, 2_usize.pow(10));
39+
}
40+
41+
#[bench]
42+
fn from_iter_large(bencher: &mut Bencher) {
43+
from_iter(bencher, 2_usize.pow(15));
44+
}
45+
46+
struct ExactIter(Range<usize>);
47+
48+
impl Iterator for ExactIter {
49+
type Item = usize;
50+
51+
fn next(&mut self) -> Option<Self::Item> {
52+
self.0.next()
53+
}
54+
55+
fn size_hint(&self) -> (usize, Option<usize>) {
56+
self.0.size_hint()
57+
}
58+
}
59+
60+
impl ExactSizeIterator for ExactIter {
61+
fn len(&self) -> usize {
62+
self.0.len()
63+
}
64+
}
65+
66+
fn from_exact_iter(bencher: &mut Bencher, size: usize) {
67+
bencher.iter(|| {
68+
let iter = black_box(ExactIter(0..size));
69+
70+
Python::with_gil(|py| {
71+
PyArray1::from_exact_iter(py, iter);
72+
});
73+
});
74+
}
75+
76+
#[bench]
77+
fn from_exact_iter_small(bencher: &mut Bencher) {
78+
from_exact_iter(bencher, 2_usize.pow(5));
79+
}
80+
81+
#[bench]
82+
fn from_exact_iter_medium(bencher: &mut Bencher) {
83+
from_exact_iter(bencher, 2_usize.pow(10));
84+
}
85+
86+
#[bench]
87+
fn from_exact_iter_large(bencher: &mut Bencher) {
88+
from_exact_iter(bencher, 2_usize.pow(15));
89+
}
90+
91+
fn from_slice(bencher: &mut Bencher, size: usize) {
92+
let vec = (0..size).collect::<Vec<_>>();
93+
94+
bencher.iter(|| {
95+
let slice = black_box(&vec);
96+
97+
Python::with_gil(|py| {
98+
PyArray1::from_slice(py, slice);
99+
});
100+
});
101+
}
102+
103+
#[bench]
104+
fn from_slice_small(bencher: &mut Bencher) {
105+
from_slice(bencher, 2_usize.pow(5));
106+
}
107+
108+
#[bench]
109+
fn from_slice_medium(bencher: &mut Bencher) {
110+
from_slice(bencher, 2_usize.pow(10));
111+
}
112+
113+
#[bench]
114+
fn from_slice_large(bencher: &mut Bencher) {
115+
from_slice(bencher, 2_usize.pow(15));
116+
}
117+
118+
fn from_object_slice(bencher: &mut Bencher, size: usize) {
119+
let vec = Python::with_gil(|py| (0..size).map(|val| val.to_object(py)).collect::<Vec<_>>());
120+
121+
bencher.iter(|| {
122+
let slice = black_box(&vec);
123+
124+
Python::with_gil(|py| {
125+
PyArray1::from_slice(py, slice);
126+
});
127+
});
128+
}
129+
130+
#[bench]
131+
fn from_object_slice_small(bencher: &mut Bencher) {
132+
from_object_slice(bencher, 2_usize.pow(5));
133+
}
134+
135+
#[bench]
136+
fn from_object_slice_medium(bencher: &mut Bencher) {
137+
from_object_slice(bencher, 2_usize.pow(10));
138+
}
139+
140+
#[bench]
141+
fn from_object_slice_large(bencher: &mut Bencher) {
142+
from_object_slice(bencher, 2_usize.pow(15));
143+
}

0 commit comments

Comments
 (0)