Open5
点群データのマスクを最速で作れるのはどの言語だ!

条件
- 128000点、4個のデータを持つ疑似データを想定
- 列1が0.5以上かつ列2が0.5以上のもののみ1にし、ほかを0とするマスクを作る

コードは適当

Dart
import 'dart:math';
import 'dart:typed_data';
void main(List<String> arguments) {
final rowLength = 128000;
final columnLength = 4;
Float32List a = Float32List(rowLength * columnLength);
// initialize with random values
final random = Random();
for (var i = 0; i < a.length; i++) {
a[i] = random.nextDouble();
}
Stopwatch stopwatch = Stopwatch()..start();
final mask = Int8List(rowLength);
for (var row = 0; row < rowLength; row++) {
// final rowData = a.sublist(row * columnLength, (row + 1) * columnLength);
// mask[row] = (rowData[0] > 0.5 && rowData[1] > 0.5) ? 1.0 : 0.0;
mask[row] = (a[row * columnLength] > 0.5 && a[row * columnLength + 1] > 0.5) ? 1 : 0;
}
print('Elapsed time: ${stopwatch.elapsedMicroseconds} us');
}
結果
$ dart run
Building package executable...
Built dart_simd:dart_simd.
Elapsed time: 1466 us

Python
import pandas as pd
import numpy as np
import time
def main():
rowLength = 128000
columnLength = 4
df = pd.DataFrame(np.random.rand(rowLength, columnLength), columns=list('ABCD'))
start = time.time()
mask = (df["A"] > 0.5) & (df["B"] > 0.5)
print(f"Time taken: {(time.time() - start) * 10**6} microseconds")
if __name__ == "__main__":
main()
結果
$ python python-simd.py
Time taken: 1999.8550415039062 microseconds

Rust
use rand::Rng;
use std::time::Instant;
fn main() {
let row_length = 128000;
let column_length = 4;
let mut a = vec![0.0; row_length * column_length];
// initialize with random values
let mut rng = rand::thread_rng();
for i in 0..a.len() {
a[i] = rng.gen();
}
let start = Instant::now();
let mut mask = vec![0i8; row_length];
for row in 0..row_length {
let idx = row * column_length;
mask[row] = if a[idx] > 0.5 && a[idx + 1] > 0.5 { 1 } else { 0 };
}
println!("Elapsed time: {:?}", start.elapsed());
}
結果
debug
$ cargo run
Compiling cfg-if v1.0.0
Compiling ppv-lite86 v0.2.17
Compiling getrandom v0.2.10
Compiling rand_core v0.6.4
Compiling rand_chacha v0.3.1
Compiling rand v0.8.5
Compiling rust-simd v0.1.0 (C:\Users\hykwy\simd-lang-bench\rust-simd)
Finished dev [unoptimized + debuginfo] target(s) in 1.80s
Running `target\debug\rust-simd.exe`
Elapsed time: 4.5158ms
release
$ cargo run --release
Compiling cfg-if v1.0.0
Compiling ppv-lite86 v0.2.17
Compiling getrandom v0.2.10
Compiling rand_core v0.6.4
Compiling rand_chacha v0.3.1
Compiling rand v0.8.5
Compiling rust-simd v0.1.0 (C:\Users\hykwy\simd-lang-bench\rust-simd)
Finished release [optimized] target(s) in 1.90s
Running `target\release\rust-simd.exe`
Elapsed time: 857µs