Skip to main content

Multithreaded version of numpy.einsum function

Project description

einsumt

Multithreaded version of numpy.einsum function.

Reasoning

Numpy's einsum is a fantastic function which allows for sophisticated array operations with a single, clear line of code. However, this function in general does not benefit from the underlaying multicore architecture and all operations are performed on a single CPU.

The idea is then to split the einsum input operands along the chosen subscript, perform computation in threads and then compose the final result by summation (if subscript is not present in output) or concatenation of partial results.

Usage

This function can be used as a replacement for numpy's einsum:

from einsumt import einsumt as einsum
result = einsum(*operands, **kwargs)

In current implementation first operand must be a subscripts string. Other differences will be treated as unintended bugs.

Benchmarking

In order to test, if einsumt would be beneficial in your particular case please run the benchmark, e.g.:

import numpy as np
from einsumt import bench_einsumt

bench_einsumt('aijk,bkl->ail',
              np.random.rand(100, 100, 10, 10),
              np.random.rand(50, 10, 50))

and the result is:

Platform:           Linux
CPU type:           Intel(R) Core(TM) i7-8750H CPU @ 2.20GHz
Subscripts:         aijk,bkl->ail
Shapes of operands: (100, 100, 10, 10), (50, 10, 50)
Leading index:      automatic
Pool type:          default
Number of threads:  12
Execution time:
    np.einsum:      2755 ms  (average from 1 runs)
    einsumt:        507.9 ms  (average from 5 runs)
Speed up:           5.424x

More exemplary benchmark calls are contained in bench_einsum.py file.

Disclaimer

Before you start to blame me because of little or no speedups please keep in mind that threading costs additional time (because of splitting and joining data for example), so einsumt function would become beneficial for larger arrays only. Note also that in many cases numpy's einsum can be efficiently replaced with combination of optimized dots, tensordots, matmuls, transpositions and so on, instead of einsumt (at cost of code clarity of course).

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

einsumt-0.9.4.tar.gz (6.2 kB view details)

Uploaded Source

Built Distribution

einsumt-0.9.4-py3-none-any.whl (6.5 kB view details)

Uploaded Python 3

File details

Details for the file einsumt-0.9.4.tar.gz.

File metadata

  • Download URL: einsumt-0.9.4.tar.gz
  • Upload date:
  • Size: 6.2 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/4.0.1 CPython/3.11.3

File hashes

Hashes for einsumt-0.9.4.tar.gz
Algorithm Hash digest
SHA256 06639495c4ef5e34092e536ae868f83fe2885addd0462270dce6e4530216a931
MD5 52034b96ff92d0eea5982fbe5b5aa4db
BLAKE2b-256 061fc049bd0fa7073bc0400404cc2a2b98852ae5e3c0d96b6290671629033bfd

See more details on using hashes here.

File details

Details for the file einsumt-0.9.4-py3-none-any.whl.

File metadata

  • Download URL: einsumt-0.9.4-py3-none-any.whl
  • Upload date:
  • Size: 6.5 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/4.0.1 CPython/3.11.3

File hashes

Hashes for einsumt-0.9.4-py3-none-any.whl
Algorithm Hash digest
SHA256 56f56752dc939be8c619c70f0796d853fe3da84e7587ab2fafc21bf936279738
MD5 b9313e2b118e9f446162624164174dfc
BLAKE2b-256 d4a1757a5410cbde43cffee4bd97adee3c31cb33327dec23b0237d07ee8da1c8

See more details on using hashes here.

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page