Skip to content

Instantly share code, notes, and snippets.

@ganesh-k13
Last active February 4, 2021 17:05
Show Gist options
  • Save ganesh-k13/6201227c5d3d65902c6eaf71357e72b1 to your computer and use it in GitHub Desktop.
Save ganesh-k13/6201227c5d3d65902c6eaf71357e72b1 to your computer and use it in GitHub Desktop.
Numpy snippetes
import numpy as np
c16 = np.complex128()
f16 = np.float128()
f8 = np.float64()
i8 = np.int64()
u8 = np.uint64()
c8 = np.complex64()
f4 = np.float32()
i4 = np.int32()
u4 = np.uint32()
dt = np.datetime64(0, "D")
td = np.timedelta64(0, "D")
b_ = np.bool_()
b = bool()
c = complex()
f = float()
i = int()
AR = np.array([0], dtype=np.int64)
AR.setflags(write=False)
SEQ = (0, 1, 2, 3, 4)
# Time structures
dt > dt
td > td
td > i
td > i4
td > i8
td > AR
td > SEQ
# boolean
b_ > b
b_ > b_
b_ > i
b_ > i8
b_ > i4
b_ > u8
b_ > u4
b_ > f
b_ > f16
b_ > f8
b_ > f4
b_ > c
b_ > c16
b_ > c8
b_ > AR
b_ > SEQ
# Complex
c16 > c16
c16 > f16
c16 > f8
c16 > i8
c16 > c8
c16 > f4
c16 > i4
c16 > b_
c16 > b
c16 > c
c16 > f
c16 > i
c16 > AR
c16 > SEQ
c16 > c16
f16 > c16
f8 > c16
i8 > c16
c8 > c16
f4 > c16
i4 > c16
b_ > c16
b > c16
c > c16
f > c16
i > c16
AR > c16
SEQ > c16
c8 > c16
c8 > f16
c8 > f8
c8 > i8
c8 > c8
c8 > f4
c8 > i4
c8 > b_
c8 > b
c8 > c
c8 > f
c8 > i
c8 > AR
c8 > SEQ
c16 > c8
f16 > c8
f8 > c8
i8 > c8
c8 > c8
f4 > c8
i4 > c8
b_ > c8
b > c8
c > c8
f > c8
i > c8
AR > c8
SEQ > c8
# Float
f16 > f8
f16 > i8
f16 > f4
f16 > i4
f16 > b_ # Crash
f16 > b
f16 > c
f16 > f
f16 > i
f16 > AR
f16 > f8
i8 > f16
f4 > f16
i4 > f16
b_ > f16
b > f16
c > f16
f > f16
i > f16
AR > f16
f8 > f8
f8 > i8
f8 > f4
f8 > i4
f8 > b_
f8 > b
f8 > c
f8 > f
f8 > i
f8 > AR
f8 > SEQ
f8 > f8
i8 > f8
f4 > f8
i4 > f8
b_ > f8
b > f8
c > f8
f > f8
i > f8
AR > f8
SEQ > f8
f4 > f16
f4 > f8
f4 > i8
f4 > f4
f4 > i4
f4 > b_
f4 > b
f4 > c
f4 > f
f4 > i
f4 > AR
f4 > SEQ
f16 > f4
f8 > f4
i8 > f4
f4 > f4
i4 > f4
b_ > f4
b > f4
c > f4
f > f4
i > f4
AR > f4
SEQ > f4
# Int
i8 > i8
i8 > u8
i8 > i4
i8 > u4
i8 > b_
i8 > b
i8 > c
i8 > f
i8 > i
i8 > AR
i8 > SEQ
u8 > u8
u8 > i4
u8 > u4
u8 > b_
u8 > b
u8 > c
u8 > f
u8 > i
u8 > AR
u8 > SEQ
i8 > i8
u8 > i8
i4 > i8
u4 > i8
b_ > i8
b > i8
c > i8
f > i8
i > i8
AR > i8
SEQ > i8
u8 > u8
i4 > u8
u4 > u8
b_ > u8
b > u8
c > u8
f > u8
i > u8
AR > u8
SEQ > u8
i4 > i8
i4 > i4
i4 > i
i4 > b_
i4 > b
i4 > AR
i4 > SEQ
u4 > i8
u4 > i4
u4 > u8
u4 > u4
u4 > i
u4 > b_
u4 > b
u4 > AR
u4 > SEQ
i8 > i4
i4 > i4
i > i4
b_ > i4
b > i4
AR > i4
SEQ > i4
i8 > u4
i4 > u4
u8 > u4
u4 > u4
b_ > u4
b > u4
i > u4
AR > u4
SEQ > u4
import numpy as np
import sys
import argparse
import cProfile
import os
import pathlib
print(np.__version__)
def divide(x, d):
x//d
if __name__ == '__main__':
parser = argparse.ArgumentParser()
parser.add_argument('-s', '--size', action='store', type=int, help='Size of array')
parser.add_argument('-d', '--divisor', action='store', type=int, help='Divisor')
parser.add_argument('-f', '--folder', action='store', help='Profiler output folder')
options = parser.parse_args()
pathlib.Path(options.folder,).mkdir(parents=True, exist_ok=True)
for i in ((10**p1) for p1 in range(2, options.size)):
for j in ((i//10)*p2 for p2 in range(1, 10)):
print(f"{j}...")
x = np.arange(j)
cProfile.run(f'divide(x, options.divisor)', f'{options.folder}/div_{j}')
# Graph for: python3 large_profiler.py -s 10 -d 30
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [],
"source": [
"import pstats\n",
"import matplotlib.pyplot as plt\n",
"import os\n",
"import re\n"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [],
"source": [
"PROFILER_PATH= 'numpy/tmp'\n",
"LENGTH_RE = '/div_([0-9]*)'\n",
"PROFILER_PATH_OPTI = PROFILER_PATH+'/libdiv'\n",
"# PROFILER_PATH_OPTI_DIV = PROFILER_PATH+'/opti_div'\n",
"PROFILER_PATH_NORMAL = PROFILER_PATH+'/normal'\n",
"plt.style.use('fast')\n",
"plt.rcParams['figure.figsize'] = [20, 5]\n"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [],
"source": [
"# %matplotlib widget\n",
"def get_total_tt(filename):\n",
" return (int(re.findall(os.path.dirname(filename)+LENGTH_RE, filename)[0]), float(pstats.Stats(filename).total_tt))\n",
"\n",
"def plot_times(a1, a2 = None, a3 = None):\n",
" plt.plot(*zip(*a1), marker='h')\n",
" a2 is not None and plt.plot(*zip(*a2), marker='x')\n",
" a3 is not None and plt.plot(*zip(*a2), marker='o')\n",
" plt.xlabel('array length')\n",
" plt.ylabel('time(s)')\n",
" plt.title('Libdivide vs normal time comparision for true divide')\n",
" plt.legend(['libdiv', 'normal'])\n",
" return plt\n",
" \n",
"def listdir_fullpath(d):\n",
" return [os.path.join(d, f) for f in os.listdir(d)]\n",
"\n",
"def get_plot_values(path):\n",
" paths = listdir_fullpath(path)\n",
" # print(paths)\n",
"\n",
" times = sorted(list(map(get_total_tt, paths)), key=lambda x: x[0])\n",
" # print(times)\n",
"\n",
" return (times)"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 1440x360 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"# %matplotlib widget\n",
"length = [10**p for p in range(10)]\n",
"\n",
"time1 = get_plot_values(PROFILER_PATH_OPTI)\n",
"time2 = get_plot_values(PROFILER_PATH_NORMAL)\n",
"# time3 = get_plot_values(PROFILER_PATH_OPTI_DIV)\n",
"# plot_times(time1, time2, time3)\n",
"plot_times(time1, time2).show()"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.8.5"
}
},
"nbformat": 4,
"nbformat_minor": 4
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment