Open5

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

fastriverfastriver

条件

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

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
fastriverfastriver

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
fastriverfastriver

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