mirror of
https://github.com/TheAlgorithms/Python.git
synced 2024-12-18 01:00:15 +00:00
9200a2e543
* from __future__ import annotations * fixup! from __future__ import annotations * fixup! from __future__ import annotations * fixup! Format Python code with psf/black push Co-authored-by: github-actions <${GITHUB_ACTOR}@users.noreply.github.com>
59 lines
1.8 KiB
Python
59 lines
1.8 KiB
Python
from __future__ import annotations
|
|
|
|
|
|
def allocation_num(number_of_bytes: int, partitions: int) -> list[str]:
|
|
"""
|
|
Divide a number of bytes into x partitions.
|
|
|
|
In a multi-threaded download, this algorithm could be used to provide
|
|
each worker thread with a block of non-overlapping bytes to download.
|
|
For example:
|
|
for i in allocation_list:
|
|
requests.get(url,headers={'Range':f'bytes={i}'})
|
|
|
|
parameter
|
|
------------
|
|
: param number_of_bytes
|
|
: param partitions
|
|
|
|
return
|
|
------------
|
|
: return: list of bytes to be assigned to each worker thread
|
|
|
|
Examples:
|
|
------------
|
|
>>> allocation_num(16647, 4)
|
|
['0-4161', '4162-8322', '8323-12483', '12484-16647']
|
|
>>> allocation_num(888, 888)
|
|
Traceback (most recent call last):
|
|
...
|
|
ValueError: partitions can not >= number_of_bytes!
|
|
>>> allocation_num(888, 999)
|
|
Traceback (most recent call last):
|
|
...
|
|
ValueError: partitions can not >= number_of_bytes!
|
|
>>> allocation_num(888, -4)
|
|
Traceback (most recent call last):
|
|
...
|
|
ValueError: partitions must be a positive number!
|
|
"""
|
|
if partitions <= 0:
|
|
raise ValueError("partitions must be a positive number!")
|
|
if partitions >= number_of_bytes:
|
|
raise ValueError("partitions can not >= number_of_bytes!")
|
|
bytes_per_partition = number_of_bytes // partitions
|
|
allocation_list = [f"0-{bytes_per_partition}"]
|
|
for i in range(1, partitions - 1):
|
|
length = f"{bytes_per_partition * i + 1}-{bytes_per_partition * (i + 1)}"
|
|
allocation_list.append(length)
|
|
allocation_list.append(
|
|
f"{(bytes_per_partition * (partitions - 1)) + 1}-" f"{number_of_bytes}"
|
|
)
|
|
return allocation_list
|
|
|
|
|
|
if __name__ == "__main__":
|
|
import doctest
|
|
|
|
doctest.testmod()
|