-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy paththreading_example.py
More file actions
61 lines (50 loc) · 1.84 KB
/
threading_example.py
File metadata and controls
61 lines (50 loc) · 1.84 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
import random
import threading
import time
from queue import Queue
NUM_COUNT = 10_000_000
NUM_THREADS = 4
print(f"Generating {NUM_COUNT} random numbers...")
nums = [random.randint(1, 100) for _ in range(NUM_COUNT)]
# Single-threaded sum
def single_threaded_sum(numbers):
start_time = time.time()
total = sum(numbers)
end_time = time.time()
return total, end_time - start_time
def part_sum(numbers_part, result_queue):
result_queue.put(sum(numbers_part))
# Multithreaded sum
def multithreaded_sum(numbers, num_threads=NUM_THREADS):
start_time = time.time()
part_size = len(numbers) // num_threads
threads = []
result_queue = Queue()
# Divide the list into parts and create threads
for i in range(num_threads):
start_index = i * part_size
end_index = start_index + part_size if i < num_threads - 1 else len(numbers)
part = numbers[start_index:end_index]
thread = threading.Thread(target=part_sum, args=(part, result_queue))
threads.append(thread)
thread.start()
for thread in threads:
thread.join()
total = sum(result_queue.get() for _ in range(num_threads))
end_time = time.time()
return total, end_time - start_time
# Run single-threaded sum
print("\nRunning single-threaded sum...")
single_total, single_time = single_threaded_sum(nums)
print(f"Single-threaded Sum: {single_total}")
# Run multithreaded sum
print("\nRunning multithreaded sum...")
multi_total, multi_time = multithreaded_sum(nums)
print(f"Multithreaded Sum: {multi_total}")
# Comparison
print("\nComparison of Results:")
print(f"{'Approach':<25} {'Time (seconds)':>15}")
print(f"{'Single-threaded':<25} {single_time:>10.5f}")
print(f"{'Multithreaded':<25} {multi_time:>10.5f}")
speedup = single_time / multi_time if multi_time > 0 else float('inf')
print(f"Speedup Factor: {speedup:.2f}x")