Compare commits
1 commit
main
...
lecture_no
Author | SHA1 | Date | |
---|---|---|---|
Tiziano Zito | 165239e433 |
|
@ -16,9 +16,6 @@
|
|||
Two exercises to activate the body and the mind
|
||||
|
||||
Common goal of both exercises is to sort a deck of tarot cards by value
|
||||
|
||||
Before starting, make yourself acquainted with the meanining and the power of the tarot cards. Carefully read [this booklet](https://aspp.school/wiki/_media/tarot-runic.pdf)
|
||||
|
||||
### First experiment: human sorting
|
||||
Setup:
|
||||
- 1 volunteer to keep the time spent sorting
|
||||
|
|
|
@ -11,7 +11,7 @@
|
|||
- `bin(14)` ➔ `'0b1110'`
|
||||
- `np.iinfo(np.int32)` ➔ `iinfo(min=-2147483648, max=2147483647, dtype=int32)`
|
||||
- Python integers, as opposed to numpy integer types, are represented with a flexible number of bits: `sys.int_info` ➔ `bits_per_digit=30, sizeof_digit=4, default_max_str_digits=4300, str_digits_check_threshold=640`
|
||||
- they are called "long" or "sperlong" integers, because they can have arbitrary size. Low level implementation explained:
|
||||
- they are called "long" or "superlong" integers, because they can have arbitrary size. Low level implementation explained:
|
||||
- [Arpit Bhayani's blog](https://arpitbhayani.me/blogs/long-integers-python/)
|
||||
- [Artem Golubin's blog](https://rushter.com/blog/python-integer-implementation/)
|
||||
|
||||
|
@ -37,7 +37,6 @@
|
|||
- UTF8 encoded, flexible width from 1B (byte) to 4B (bytes): 1,112,064 Unicode characters (code points)
|
||||
- ASCII: 7 bits (fits in one byte), 127 characters ➔ [ASCII table](https://upload.wikimedia.org/wikipedia/commons/2/26/ASCII_Table_%28suitable_for_printing%29.svg)
|
||||
- [visualization](https://sonarsource.github.io/utf8-visualizer/)
|
||||
- actually in Python strings (more precisely: unicode objects) are stored in different formats depending on which characters are stored for memory efficiency. Look at the gory details [here](https://docs.python.org/3.14/c-api/unicode.html) ➔ not for the faint-hearted!
|
||||
|
||||
- **hexadecimal notation**:
|
||||
- base16 ➔ '0, 1, 2, 3, 4, 5, 6, 7, 8, 9, a, b, c, d, e, f'
|
||||
|
|
|
@ -1,172 +0,0 @@
|
|||
{
|
||||
"cells": [
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"metadata": {
|
||||
"execution": {
|
||||
"iopub.execute_input": "2024-03-04T09:40:28.904Z",
|
||||
"iopub.status.busy": "2024-03-04T09:40:28.896Z",
|
||||
"iopub.status.idle": "2024-03-04T09:40:28.978Z",
|
||||
"shell.execute_reply": "2024-03-04T09:40:28.967Z"
|
||||
}
|
||||
},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"import numpy as np"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"metadata": {
|
||||
"execution": {
|
||||
"iopub.execute_input": "2024-03-04T10:02:39.062Z",
|
||||
"iopub.status.busy": "2024-03-04T10:02:39.057Z",
|
||||
"iopub.status.idle": "2024-03-04T10:02:39.068Z",
|
||||
"shell.execute_reply": "2024-03-04T10:02:39.071Z"
|
||||
}
|
||||
},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"n_series = 32\n",
|
||||
"len_one_series = 5*2**20\n",
|
||||
"time_series = np.random.rand(n_series, len_one_series)\n",
|
||||
"gap = 16*2**10"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"metadata": {
|
||||
"execution": {
|
||||
"iopub.execute_input": "2024-03-04T10:02:41.027Z",
|
||||
"iopub.status.busy": "2024-03-04T10:02:41.020Z",
|
||||
"iopub.status.idle": "2024-03-04T10:02:41.036Z",
|
||||
"shell.execute_reply": "2024-03-04T10:02:41.040Z"
|
||||
},
|
||||
"scrolled": true
|
||||
},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"print(f'Size of one time series: {int(time_series[0].nbytes/2**20)} M')\n",
|
||||
"print(f'Size of collection: {int(time_series.nbytes/2**20)} M')\n",
|
||||
"print(f'Gap size: {int(gap*8/2**10)} K')\n",
|
||||
"print(f'Gapped series size: {int(time_series[0, ::gap].nbytes/2**10)} K')"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"metadata": {
|
||||
"execution": {
|
||||
"iopub.execute_input": "2024-03-04T10:06:08.461Z",
|
||||
"iopub.status.busy": "2024-03-04T10:06:08.459Z",
|
||||
"iopub.status.idle": "2024-03-04T10:06:08.466Z",
|
||||
"shell.execute_reply": "2024-03-04T10:06:08.468Z"
|
||||
}
|
||||
},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"# compute a Taylor-like series\n",
|
||||
"def taylor(time_series, mean, gap):\n",
|
||||
" for row, ts in enumerate(time_series):\n",
|
||||
" for pwr in range(1,20):\n",
|
||||
" mean[row] += (ts[::gap]**pwr).sum()\n",
|
||||
" return mean\n",
|
||||
" "
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"metadata": {
|
||||
"execution": {
|
||||
"iopub.execute_input": "2024-03-04T10:06:08.461Z",
|
||||
"iopub.status.busy": "2024-03-04T10:06:08.459Z",
|
||||
"iopub.status.idle": "2024-03-04T10:06:08.466Z",
|
||||
"shell.execute_reply": "2024-03-04T10:06:08.468Z"
|
||||
}
|
||||
},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"def taylor_improved(time_series, mean, gap):\n",
|
||||
" y = time_series[:,::gap].copy()\n",
|
||||
" for row, ts in enumerate(y):\n",
|
||||
" for pwr in range(1,20):\n",
|
||||
" mean[row] += (ts**pwr).sum()\n",
|
||||
" return mean"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"# verify that they yield the same results\n",
|
||||
"out1 = taylor(time_series, np.zeros(n_series), gap)\n",
|
||||
"out2 = taylor_improved(time_series, np.zeros(n_series), gap)\n",
|
||||
"np.testing.assert_allclose(out1, out2)"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"metadata": {
|
||||
"execution": {
|
||||
"iopub.execute_input": "2024-03-04T10:06:14.959Z",
|
||||
"iopub.status.busy": "2024-03-04T10:06:14.956Z",
|
||||
"iopub.status.idle": "2024-03-04T10:06:17.437Z",
|
||||
"shell.execute_reply": "2024-03-04T10:06:17.443Z"
|
||||
}
|
||||
},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"mean = np.zeros(n_series, dtype='float64')\n",
|
||||
"%timeit taylor(time_series, mean, gap)"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"metadata": {
|
||||
"execution": {
|
||||
"iopub.execute_input": "2024-03-04T10:06:20.056Z",
|
||||
"iopub.status.busy": "2024-03-04T10:06:20.053Z",
|
||||
"iopub.status.idle": "2024-03-04T10:06:21.695Z",
|
||||
"shell.execute_reply": "2024-03-04T10:06:21.700Z"
|
||||
}
|
||||
},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"mean = np.zeros(n_series, dtype='float64')\n",
|
||||
"%timeit taylor_improved(time_series, mean, gap)"
|
||||
]
|
||||
}
|
||||
],
|
||||
"metadata": {
|
||||
"kernelspec": {
|
||||
"display_name": "Python 3 (ipykernel)",
|
||||
"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.12.5"
|
||||
},
|
||||
"nteract": {
|
||||
"version": "0.28.0"
|
||||
}
|
||||
},
|
||||
"nbformat": 4,
|
||||
"nbformat_minor": 2
|
||||
}
|
Loading…
Reference in a new issue