pyroid 0.2.7__tar.gz → 0.2.8__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (125) hide show
  1. {pyroid-0.2.7 → pyroid-0.2.8}/Cargo.lock +1 -1
  2. {pyroid-0.2.7 → pyroid-0.2.8}/Cargo.toml +15 -3
  3. {pyroid-0.2.7 → pyroid-0.2.8}/PKG-INFO +50 -65
  4. {pyroid-0.2.7 → pyroid-0.2.8}/README.md +49 -64
  5. {pyroid-0.2.7 → pyroid-0.2.8}/benchmarks/README.md +40 -5
  6. pyroid-0.2.8/docs/api/dataframe_ops.md +256 -0
  7. pyroid-0.2.8/docs/api/image_ops.md +473 -0
  8. pyroid-0.2.8/docs/api/index.md +219 -0
  9. pyroid-0.2.8/docs/api/io_ops.md +338 -0
  10. pyroid-0.2.8/docs/api/ml_ops.md +377 -0
  11. pyroid-0.2.8/docs/api/text_nlp_ops.md +518 -0
  12. pyroid-0.2.8/docs/guides/getting_started.md +225 -0
  13. pyroid-0.2.8/docs/guides/index.md +36 -0
  14. pyroid-0.2.8/docs/guides/performance.md +163 -0
  15. pyroid-0.2.8/docs/index.md +168 -0
  16. pyroid-0.2.8/examples/async_examples.py +166 -0
  17. pyroid-0.2.8/examples/data_examples.py +135 -0
  18. pyroid-0.2.8/examples/dataframe_examples.py +140 -0
  19. pyroid-0.2.8/examples/image_examples.py +151 -0
  20. pyroid-0.2.8/examples/io_examples.py +128 -0
  21. pyroid-0.2.8/examples/math_examples.py +155 -0
  22. pyroid-0.2.8/examples/ml_examples.py +170 -0
  23. pyroid-0.2.8/examples/requirements.txt +5 -0
  24. pyroid-0.2.8/examples/string_examples.py +118 -0
  25. pyroid-0.2.8/examples/test_async_file.txt +3 -0
  26. pyroid-0.2.8/examples/text_nlp_examples.py +169 -0
  27. pyroid-0.2.8/pyproject.toml +78 -0
  28. {pyroid-0.2.7 → pyroid-0.2.8}/python/pyroid/__init__.py +3 -1
  29. pyroid-0.2.8/python/pyroid/string/__init__.py +47 -0
  30. {pyroid-0.2.7 → pyroid-0.2.8}/python/pyroid/text/__init__.py +16 -0
  31. {pyroid-0.2.7 → pyroid-0.2.8}/setup.py +3 -2
  32. {pyroid-0.2.7 → pyroid-0.2.8}/src/core/types.rs +3 -3
  33. {pyroid-0.2.7 → pyroid-0.2.8}/src/io/file.rs +2 -2
  34. pyroid-0.2.8/test_pyroid.py +334 -0
  35. pyroid-0.2.7/benchmarks/README_update.md +0 -46
  36. pyroid-0.2.7/benchmarks/benchmark_plan.md +0 -216
  37. pyroid-0.2.7/benchmarks/generate_notebook.py +0 -35
  38. pyroid-0.2.7/benchmarks/pyroid_benchmarks.ipynb +0 -1133
  39. pyroid-0.2.7/docs/api/dataframe_ops.md +0 -382
  40. pyroid-0.2.7/docs/api/image_ops.md +0 -274
  41. pyroid-0.2.7/docs/api/index.md +0 -139
  42. pyroid-0.2.7/docs/api/io_ops.md +0 -702
  43. pyroid-0.2.7/docs/api/ml_ops.md +0 -389
  44. pyroid-0.2.7/docs/api/text_nlp_ops.md +0 -507
  45. pyroid-0.2.7/docs/guides/getting_started.md +0 -427
  46. pyroid-0.2.7/docs/guides/index.md +0 -100
  47. pyroid-0.2.7/docs/guides/performance.md +0 -559
  48. pyroid-0.2.7/docs/index.md +0 -206
  49. pyroid-0.2.7/examples/async_examples.py +0 -138
  50. pyroid-0.2.7/examples/data_examples.py +0 -69
  51. pyroid-0.2.7/examples/dataframe_examples.py +0 -154
  52. pyroid-0.2.7/examples/image_examples.py +0 -180
  53. pyroid-0.2.7/examples/io_examples.py +0 -173
  54. pyroid-0.2.7/examples/math_examples.py +0 -102
  55. pyroid-0.2.7/examples/ml_examples.py +0 -202
  56. pyroid-0.2.7/examples/requirements.txt +0 -11
  57. pyroid-0.2.7/examples/string_examples.py +0 -74
  58. pyroid-0.2.7/examples/test_async_file.txt +0 -3
  59. pyroid-0.2.7/examples/text_nlp_examples.py +0 -136
  60. pyroid-0.2.7/pyproject.toml +0 -76
  61. pyroid-0.2.7/test_pyroid.py +0 -72
  62. {pyroid-0.2.7 → pyroid-0.2.8}/.github/workflows/publish.yml +0 -0
  63. {pyroid-0.2.7 → pyroid-0.2.8}/.github/workflows/semantic-release.yml +0 -0
  64. {pyroid-0.2.7 → pyroid-0.2.8}/.gitignore +0 -0
  65. {pyroid-0.2.7 → pyroid-0.2.8}/benchmarks/__init__.py +0 -0
  66. {pyroid-0.2.7 → pyroid-0.2.8}/benchmarks/core/__init__.py +0 -0
  67. {pyroid-0.2.7 → pyroid-0.2.8}/benchmarks/core/benchmark.py +0 -0
  68. {pyroid-0.2.7 → pyroid-0.2.8}/benchmarks/core/reporter.py +0 -0
  69. {pyroid-0.2.7 → pyroid-0.2.8}/benchmarks/core/visualizer.py +0 -0
  70. {pyroid-0.2.7 → pyroid-0.2.8}/benchmarks/demo.py +0 -0
  71. {pyroid-0.2.7 → pyroid-0.2.8}/benchmarks/run_benchmarks.py +0 -0
  72. {pyroid-0.2.7 → pyroid-0.2.8}/benchmarks/suites/__init__.py +0 -0
  73. {pyroid-0.2.7 → pyroid-0.2.8}/benchmarks/suites/async_benchmarks.py +0 -0
  74. {pyroid-0.2.7 → pyroid-0.2.8}/benchmarks/suites/data_benchmarks.py +0 -0
  75. {pyroid-0.2.7 → pyroid-0.2.8}/benchmarks/suites/math_benchmarks.py +0 -0
  76. {pyroid-0.2.7 → pyroid-0.2.8}/benchmarks/suites/scenarios/__init__.py +0 -0
  77. {pyroid-0.2.7 → pyroid-0.2.8}/benchmarks/suites/scenarios/data_pipeline.py +0 -0
  78. {pyroid-0.2.7 → pyroid-0.2.8}/benchmarks/suites/scenarios/scientific_computing.py +0 -0
  79. {pyroid-0.2.7 → pyroid-0.2.8}/benchmarks/suites/scenarios/text_processing.py +0 -0
  80. {pyroid-0.2.7 → pyroid-0.2.8}/benchmarks/suites/scenarios/web_scraping.py +0 -0
  81. {pyroid-0.2.7 → pyroid-0.2.8}/benchmarks/suites/string_benchmarks.py +0 -0
  82. {pyroid-0.2.7 → pyroid-0.2.8}/build.rs +0 -0
  83. {pyroid-0.2.7 → pyroid-0.2.8}/python/__init__.py +0 -0
  84. {pyroid-0.2.7 → pyroid-0.2.8}/python/pyroid/core/__init__.py +0 -0
  85. {pyroid-0.2.7 → pyroid-0.2.8}/python/pyroid/data/__init__.py +0 -0
  86. {pyroid-0.2.7 → pyroid-0.2.8}/python/pyroid/image/__init__.py +0 -0
  87. {pyroid-0.2.7 → pyroid-0.2.8}/python/pyroid/image/basic/__init__.py +0 -0
  88. {pyroid-0.2.7 → pyroid-0.2.8}/python/pyroid/io/__init__.py +0 -0
  89. {pyroid-0.2.7 → pyroid-0.2.8}/python/pyroid/math/__init__.py +0 -0
  90. {pyroid-0.2.7 → pyroid-0.2.8}/python/pyroid/math/stats.py +0 -0
  91. {pyroid-0.2.7 → pyroid-0.2.8}/python/pyroid/ml/__init__.py +0 -0
  92. {pyroid-0.2.7 → pyroid-0.2.8}/python/pyroid/ml/basic/__init__.py +0 -0
  93. {pyroid-0.2.7 → pyroid-0.2.8}/python/tests/__init__.py +0 -0
  94. {pyroid-0.2.7 → pyroid-0.2.8}/python/tests/test_basic.py +0 -0
  95. {pyroid-0.2.7 → pyroid-0.2.8}/src/async_ops.rs +0 -0
  96. {pyroid-0.2.7 → pyroid-0.2.8}/src/core/config.rs +0 -0
  97. {pyroid-0.2.7 → pyroid-0.2.8}/src/core/conversion.rs +0 -0
  98. {pyroid-0.2.7 → pyroid-0.2.8}/src/core/error.rs +0 -0
  99. {pyroid-0.2.7 → pyroid-0.2.8}/src/core/mod.rs +0 -0
  100. {pyroid-0.2.7 → pyroid-0.2.8}/src/data/collections.rs +0 -0
  101. {pyroid-0.2.7 → pyroid-0.2.8}/src/data/dataframe.rs +0 -0
  102. {pyroid-0.2.7 → pyroid-0.2.8}/src/data/mod.rs +0 -0
  103. {pyroid-0.2.7 → pyroid-0.2.8}/src/data_ops.rs +0 -0
  104. {pyroid-0.2.7 → pyroid-0.2.8}/src/dataframe_ops.rs +0 -0
  105. {pyroid-0.2.7 → pyroid-0.2.8}/src/image/basic.rs +0 -0
  106. {pyroid-0.2.7 → pyroid-0.2.8}/src/image/mod.rs +0 -0
  107. {pyroid-0.2.7 → pyroid-0.2.8}/src/image_ops.rs +0 -0
  108. {pyroid-0.2.7 → pyroid-0.2.8}/src/io/async_io.rs +0 -0
  109. {pyroid-0.2.7 → pyroid-0.2.8}/src/io/mod.rs +0 -0
  110. {pyroid-0.2.7 → pyroid-0.2.8}/src/io/network.rs +0 -0
  111. {pyroid-0.2.7 → pyroid-0.2.8}/src/io_ops.rs +0 -0
  112. {pyroid-0.2.7 → pyroid-0.2.8}/src/lib.rs +0 -0
  113. {pyroid-0.2.7 → pyroid-0.2.8}/src/math/matrix.rs +0 -0
  114. {pyroid-0.2.7 → pyroid-0.2.8}/src/math/mod.rs +0 -0
  115. {pyroid-0.2.7 → pyroid-0.2.8}/src/math/stats.rs +0 -0
  116. {pyroid-0.2.7 → pyroid-0.2.8}/src/math/vector.rs +0 -0
  117. {pyroid-0.2.7 → pyroid-0.2.8}/src/math_ops.rs +0 -0
  118. {pyroid-0.2.7 → pyroid-0.2.8}/src/ml/basic.rs +0 -0
  119. {pyroid-0.2.7 → pyroid-0.2.8}/src/ml/mod.rs +0 -0
  120. {pyroid-0.2.7 → pyroid-0.2.8}/src/ml_ops.rs +0 -0
  121. {pyroid-0.2.7 → pyroid-0.2.8}/src/string_ops.rs +0 -0
  122. {pyroid-0.2.7 → pyroid-0.2.8}/src/text/mod.rs +0 -0
  123. {pyroid-0.2.7 → pyroid-0.2.8}/src/text_nlp_ops.rs +0 -0
  124. {pyroid-0.2.7 → pyroid-0.2.8}/src/utils/conversions.rs +0 -0
  125. {pyroid-0.2.7 → pyroid-0.2.8}/src/utils/mod.rs +0 -0
@@ -608,7 +608,7 @@ dependencies = [
608
608
 
609
609
  [[package]]
610
610
  name = "pyroid"
611
- version = "0.2.7"
611
+ version = "0.2.8"
612
612
  dependencies = [
613
613
  "criterion",
614
614
  "futures",
@@ -1,6 +1,6 @@
1
1
  [package]
2
2
  name = "pyroid"
3
- version = "0.2.7"
3
+ version = "0.2.8"
4
4
  edition = "2021"
5
5
  authors = ["Andrew O", "Pyroid Team"]
6
6
  description = "High-performance Rust functions for Python"
@@ -24,13 +24,24 @@ ml = []
24
24
 
25
25
  [dependencies]
26
26
  # Core dependencies
27
- pyo3 = { version = "0.20.0", features = ["extension-module", "auto-initialize", "abi3-py38"] }
27
+ pyo3 = { version = "0.20.0", features = [
28
+ "extension-module",
29
+ "auto-initialize",
30
+ "abi3-py38",
31
+ ] }
28
32
  rayon = "1.10.0"
29
33
  serde_json = "1.0.114"
30
34
  num_cpus = "1.16.0"
31
35
 
32
36
  # Optional dependencies based on features
33
- tokio = { version = "1.44.1", features = ["rt", "rt-multi-thread", "macros", "io-util", "fs", "time"], optional = true }
37
+ tokio = { version = "1.44.1", features = [
38
+ "rt",
39
+ "rt-multi-thread",
40
+ "macros",
41
+ "io-util",
42
+ "fs",
43
+ "time",
44
+ ], optional = true }
34
45
  futures = { version = "0.3.31", optional = true }
35
46
  regex = { version = "1.10.3", optional = true }
36
47
 
@@ -53,3 +64,4 @@ strip = true
53
64
  [profile.dev]
54
65
  opt-level = 0
55
66
  debug = true
67
+
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: pyroid
3
- Version: 0.2.7
3
+ Version: 0.2.8
4
4
  Classifier: Programming Language :: Python :: 3
5
5
  Classifier: Programming Language :: Python :: 3.8
6
6
  Classifier: Programming Language :: Python :: 3.9
@@ -151,13 +151,13 @@ import pyroid
151
151
 
152
152
  # Basic string operations
153
153
  text = "Hello, world!"
154
- reversed_text = pyroid.string.reverse(text)
155
- uppercase = pyroid.string.to_uppercase(text)
156
- lowercase = pyroid.string.to_lowercase(text)
154
+ reversed_text = pyroid.text.reverse(text)
155
+ uppercase = pyroid.text.to_uppercase(text)
156
+ lowercase = pyroid.text.to_lowercase(text)
157
157
 
158
158
  # Base64 encoding/decoding
159
- encoded = pyroid.string.base64_encode(text)
160
- decoded = pyroid.string.base64_decode(encoded)
159
+ encoded = pyroid.text.base64_encode(text)
160
+ decoded = pyroid.text.base64_decode(encoded)
161
161
  print(f"Original: {text}")
162
162
  print(f"Encoded: {encoded}")
163
163
  print(f"Decoded: {decoded}")
@@ -168,24 +168,21 @@ print(f"Decoded: {decoded}")
168
168
  ```python
169
169
  import pyroid
170
170
 
171
- # Create a dictionary representing a DataFrame
172
- df = {
173
- 'A': [1, 2, 3, 4, 5],
174
- 'B': [10, 20, 30, 40, 50],
175
- 'C': [100, 200, 300, 400, 500]
176
- }
177
-
178
- # Create a DataFrame object
179
- dataframe = pyroid.data.dataframe.PyDataFrame(df)
171
+ # Create a DataFrame
172
+ df = pyroid.data.DataFrame({
173
+ 'id': [1, 2, 3, 4, 5],
174
+ 'name': ['Alice', 'Bob', 'Charlie', 'David', 'Eve'],
175
+ 'age': [25, 30, 35, 40, 45]
176
+ })
180
177
 
181
178
  # Apply a function to each column
182
- def square(x):
183
- return [val * val for val in x]
179
+ result = pyroid.data.apply(df, lambda x: x * 2, axis=0)
180
+ print(f"DataFrame: {df}")
181
+ print(f"Applied function: {result}")
184
182
 
185
- result = dataframe.apply(square)
186
- print(f"DataFrame shape: {dataframe.shape}")
187
- print(f"DataFrame columns: {dataframe.columns}")
188
- print(f"Result: {result.to_dict()}")
183
+ # Group by and aggregate
184
+ grouped = pyroid.data.groupby_aggregate(df, "age", {"name": "count"})
185
+ print(f"Grouped by age: {grouped}")
189
186
  ```
190
187
 
191
188
  ### Collection Operations
@@ -195,21 +192,21 @@ import pyroid
195
192
 
196
193
  # Filter a list
197
194
  numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
198
- even_numbers = pyroid.data.collections.filter(numbers, lambda x: x % 2 == 0)
195
+ even_numbers = pyroid.data.filter(numbers, lambda x: x % 2 == 0)
199
196
  print(f"Even numbers: {even_numbers}")
200
197
 
201
198
  # Map a function over a list
202
- squared = pyroid.data.collections.map(numbers, lambda x: x * x)
199
+ squared = pyroid.data.map(numbers, lambda x: x * x)
203
200
  print(f"Squared numbers: {squared}")
204
201
 
205
202
  # Reduce a list
206
- sum_result = pyroid.data.collections.reduce(numbers, lambda x, y: x + y)
203
+ sum_result = pyroid.data.reduce(numbers, lambda x, y: x + y)
207
204
  print(f"Sum: {sum_result}")
208
205
 
209
206
  # Sort a list
210
207
  unsorted = [5, 2, 8, 1, 9, 3]
211
- sorted_list = pyroid.data.collections.sort(unsorted)
212
- print(f"Sorted: {sorted_list}")
208
+ sorted_list = pyroid.data.sort(unsorted, reverse=True) # Note: supports reverse parameter
209
+ print(f"Sorted (descending): {sorted_list}")
213
210
  ```
214
211
 
215
212
  ### File I/O Operations
@@ -218,17 +215,16 @@ print(f"Sorted: {sorted_list}")
218
215
  import pyroid
219
216
 
220
217
  # Read a file
221
- content = pyroid.io.file.read_file("example.txt")
218
+ content = pyroid.io.read_file("example.txt")
222
219
  print(f"File content length: {len(content)}")
223
220
 
224
221
  # Write a file
225
- pyroid.io.file.write_file("output.txt", b"Hello, world!")
222
+ pyroid.io.write_file("output.txt", "Hello, world!") # Note: string, not bytes
226
223
 
227
224
  # Read multiple files
228
225
  files = ["file1.txt", "file2.txt", "file3.txt"]
229
- contents = pyroid.io.file.read_files(files)
230
- for file, content in contents.items():
231
- print(f"{file}: {len(content)} bytes")
226
+ contents = pyroid.io.read_files(files)
227
+ print(f"Read multiple files: {contents}")
232
228
  ```
233
229
 
234
230
  ### Network Operations
@@ -237,14 +233,11 @@ for file, content in contents.items():
237
233
  import pyroid
238
234
 
239
235
  # Make a GET request
240
- response = pyroid.io.network.get("https://example.com")
241
- print(f"Status: {response['status']}")
242
- print(f"Body length: {len(response['body'])}")
243
-
244
- # Make a POST request with JSON data
245
- data = {"name": "John", "age": 30}
246
- response = pyroid.io.network.post("https://example.com/api", json=data)
247
- print(f"Status: {response['status']}")
236
+ response = pyroid.io.get("https://example.com")
237
+ print(f"HTTP GET response length: {len(response)}")
238
+
239
+ # Note: POST requests might not be implemented in the current version
240
+ # If you need to make POST requests, check the documentation for the latest API
248
241
  ```
249
242
 
250
243
  ### Async Operations
@@ -256,22 +249,15 @@ import pyroid
256
249
  async def main():
257
250
  # Async sleep
258
251
  print("Sleeping for 1 second...")
259
- await pyroid.io.async_io.sleep(1.0)
252
+ await pyroid.io.sleep(0.1)
260
253
  print("Awake!")
261
254
 
262
255
  # Async file operations
263
- await pyroid.io.async_io.write_file_async("async_test.txt", b"Hello, async world!")
264
- content = await pyroid.io.async_io.read_file_async("async_test.txt")
256
+ content = await pyroid.io.read_file_async("example.txt")
265
257
  print(f"File content: {content}")
266
258
 
267
- # Async HTTP requests
268
- response = await pyroid.io.async_io.http_get_async("https://example.com")
269
- print(f"Response length: {len(response)}")
270
-
271
- # Async HTTP POST
272
- data = {"name": "John", "age": 30}
273
- response = await pyroid.io.async_io.http_post_async("https://example.com/api", json=data)
274
- print(f"Response length: {len(response)}")
259
+ # Note: Other async operations might not be fully implemented
260
+ # in the current version. Check the documentation for the latest API.
275
261
 
276
262
  # Run the async main function
277
263
  asyncio.run(main())
@@ -317,27 +303,26 @@ data = [
317
303
  [1.0, 2.0], [1.5, 1.8], [5.0, 8.0],
318
304
  [8.0, 8.0], [1.0, 0.6], [9.0, 11.0]
319
305
  ]
320
- result = pyroid.ml.basic.kmeans(data, k=2)
321
- print(f"Centroids: {result['centroids']}")
322
- print(f"Clusters: {result['clusters']}")
306
+ kmeans_result = pyroid.ml.basic.kmeans(data, k=2)
307
+ print(f"K-means centroids: {kmeans_result['centroids']}")
308
+ print(f"K-means clusters: {kmeans_result['clusters']}")
323
309
 
324
310
  # Linear regression
325
- x = [1.0, 2.0, 3.0, 4.0, 5.0]
326
- y = [2.0, 4.0, 5.0, 4.0, 6.0]
327
- result = pyroid.ml.basic.linear_regression(x, y)
328
- print(f"Slope: {result['slope']}")
329
- print(f"Intercept: {result['intercept']}")
330
- print(f"R-squared: {result['r_squared']}")
311
+ # Note: Linear regression expects X as 2D array and y as 1D array
312
+ X = [[1, 1], [1, 2], [2, 2], [2, 3]]
313
+ y = [6, 8, 9, 11]
314
+ regression_result = pyroid.ml.basic.linear_regression(X, y)
315
+ print(f"Linear regression coefficients: {regression_result['coefficients']}")
316
+ print(f"Linear regression intercept: {regression_result['intercept']}")
317
+ print(f"Linear regression R-squared: {regression_result['r_squared']}")
331
318
 
332
319
  # Data normalization
333
- values = [10.0, 20.0, 30.0, 40.0, 50.0]
334
- normalized = pyroid.ml.basic.normalize(values, method="minmax")
335
- print(f"Normalized (min-max): {normalized}")
320
+ normalized_data = pyroid.ml.basic.normalize(data, method="min-max")
321
+ print(f"Normalized data (min-max): {normalized_data}")
336
322
 
337
323
  # Distance matrix
338
- points = [[1.0, 2.0], [3.0, 4.0], [5.0, 6.0]]
339
- distances = pyroid.ml.basic.distance_matrix(points, metric="euclidean")
340
- print(f"Distance matrix: {distances}")
324
+ distance_matrix = pyroid.ml.basic.distance_matrix(data, metric="euclidean")
325
+ print(f"Distance matrix shape: {len(distance_matrix)}x{len(distance_matrix[0])}")
341
326
  ```
342
327
 
343
328
  ## 📊 Performance Considerations
@@ -127,13 +127,13 @@ import pyroid
127
127
 
128
128
  # Basic string operations
129
129
  text = "Hello, world!"
130
- reversed_text = pyroid.string.reverse(text)
131
- uppercase = pyroid.string.to_uppercase(text)
132
- lowercase = pyroid.string.to_lowercase(text)
130
+ reversed_text = pyroid.text.reverse(text)
131
+ uppercase = pyroid.text.to_uppercase(text)
132
+ lowercase = pyroid.text.to_lowercase(text)
133
133
 
134
134
  # Base64 encoding/decoding
135
- encoded = pyroid.string.base64_encode(text)
136
- decoded = pyroid.string.base64_decode(encoded)
135
+ encoded = pyroid.text.base64_encode(text)
136
+ decoded = pyroid.text.base64_decode(encoded)
137
137
  print(f"Original: {text}")
138
138
  print(f"Encoded: {encoded}")
139
139
  print(f"Decoded: {decoded}")
@@ -144,24 +144,21 @@ print(f"Decoded: {decoded}")
144
144
  ```python
145
145
  import pyroid
146
146
 
147
- # Create a dictionary representing a DataFrame
148
- df = {
149
- 'A': [1, 2, 3, 4, 5],
150
- 'B': [10, 20, 30, 40, 50],
151
- 'C': [100, 200, 300, 400, 500]
152
- }
153
-
154
- # Create a DataFrame object
155
- dataframe = pyroid.data.dataframe.PyDataFrame(df)
147
+ # Create a DataFrame
148
+ df = pyroid.data.DataFrame({
149
+ 'id': [1, 2, 3, 4, 5],
150
+ 'name': ['Alice', 'Bob', 'Charlie', 'David', 'Eve'],
151
+ 'age': [25, 30, 35, 40, 45]
152
+ })
156
153
 
157
154
  # Apply a function to each column
158
- def square(x):
159
- return [val * val for val in x]
155
+ result = pyroid.data.apply(df, lambda x: x * 2, axis=0)
156
+ print(f"DataFrame: {df}")
157
+ print(f"Applied function: {result}")
160
158
 
161
- result = dataframe.apply(square)
162
- print(f"DataFrame shape: {dataframe.shape}")
163
- print(f"DataFrame columns: {dataframe.columns}")
164
- print(f"Result: {result.to_dict()}")
159
+ # Group by and aggregate
160
+ grouped = pyroid.data.groupby_aggregate(df, "age", {"name": "count"})
161
+ print(f"Grouped by age: {grouped}")
165
162
  ```
166
163
 
167
164
  ### Collection Operations
@@ -171,21 +168,21 @@ import pyroid
171
168
 
172
169
  # Filter a list
173
170
  numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
174
- even_numbers = pyroid.data.collections.filter(numbers, lambda x: x % 2 == 0)
171
+ even_numbers = pyroid.data.filter(numbers, lambda x: x % 2 == 0)
175
172
  print(f"Even numbers: {even_numbers}")
176
173
 
177
174
  # Map a function over a list
178
- squared = pyroid.data.collections.map(numbers, lambda x: x * x)
175
+ squared = pyroid.data.map(numbers, lambda x: x * x)
179
176
  print(f"Squared numbers: {squared}")
180
177
 
181
178
  # Reduce a list
182
- sum_result = pyroid.data.collections.reduce(numbers, lambda x, y: x + y)
179
+ sum_result = pyroid.data.reduce(numbers, lambda x, y: x + y)
183
180
  print(f"Sum: {sum_result}")
184
181
 
185
182
  # Sort a list
186
183
  unsorted = [5, 2, 8, 1, 9, 3]
187
- sorted_list = pyroid.data.collections.sort(unsorted)
188
- print(f"Sorted: {sorted_list}")
184
+ sorted_list = pyroid.data.sort(unsorted, reverse=True) # Note: supports reverse parameter
185
+ print(f"Sorted (descending): {sorted_list}")
189
186
  ```
190
187
 
191
188
  ### File I/O Operations
@@ -194,17 +191,16 @@ print(f"Sorted: {sorted_list}")
194
191
  import pyroid
195
192
 
196
193
  # Read a file
197
- content = pyroid.io.file.read_file("example.txt")
194
+ content = pyroid.io.read_file("example.txt")
198
195
  print(f"File content length: {len(content)}")
199
196
 
200
197
  # Write a file
201
- pyroid.io.file.write_file("output.txt", b"Hello, world!")
198
+ pyroid.io.write_file("output.txt", "Hello, world!") # Note: string, not bytes
202
199
 
203
200
  # Read multiple files
204
201
  files = ["file1.txt", "file2.txt", "file3.txt"]
205
- contents = pyroid.io.file.read_files(files)
206
- for file, content in contents.items():
207
- print(f"{file}: {len(content)} bytes")
202
+ contents = pyroid.io.read_files(files)
203
+ print(f"Read multiple files: {contents}")
208
204
  ```
209
205
 
210
206
  ### Network Operations
@@ -213,14 +209,11 @@ for file, content in contents.items():
213
209
  import pyroid
214
210
 
215
211
  # Make a GET request
216
- response = pyroid.io.network.get("https://example.com")
217
- print(f"Status: {response['status']}")
218
- print(f"Body length: {len(response['body'])}")
219
-
220
- # Make a POST request with JSON data
221
- data = {"name": "John", "age": 30}
222
- response = pyroid.io.network.post("https://example.com/api", json=data)
223
- print(f"Status: {response['status']}")
212
+ response = pyroid.io.get("https://example.com")
213
+ print(f"HTTP GET response length: {len(response)}")
214
+
215
+ # Note: POST requests might not be implemented in the current version
216
+ # If you need to make POST requests, check the documentation for the latest API
224
217
  ```
225
218
 
226
219
  ### Async Operations
@@ -232,22 +225,15 @@ import pyroid
232
225
  async def main():
233
226
  # Async sleep
234
227
  print("Sleeping for 1 second...")
235
- await pyroid.io.async_io.sleep(1.0)
228
+ await pyroid.io.sleep(0.1)
236
229
  print("Awake!")
237
230
 
238
231
  # Async file operations
239
- await pyroid.io.async_io.write_file_async("async_test.txt", b"Hello, async world!")
240
- content = await pyroid.io.async_io.read_file_async("async_test.txt")
232
+ content = await pyroid.io.read_file_async("example.txt")
241
233
  print(f"File content: {content}")
242
234
 
243
- # Async HTTP requests
244
- response = await pyroid.io.async_io.http_get_async("https://example.com")
245
- print(f"Response length: {len(response)}")
246
-
247
- # Async HTTP POST
248
- data = {"name": "John", "age": 30}
249
- response = await pyroid.io.async_io.http_post_async("https://example.com/api", json=data)
250
- print(f"Response length: {len(response)}")
235
+ # Note: Other async operations might not be fully implemented
236
+ # in the current version. Check the documentation for the latest API.
251
237
 
252
238
  # Run the async main function
253
239
  asyncio.run(main())
@@ -293,27 +279,26 @@ data = [
293
279
  [1.0, 2.0], [1.5, 1.8], [5.0, 8.0],
294
280
  [8.0, 8.0], [1.0, 0.6], [9.0, 11.0]
295
281
  ]
296
- result = pyroid.ml.basic.kmeans(data, k=2)
297
- print(f"Centroids: {result['centroids']}")
298
- print(f"Clusters: {result['clusters']}")
282
+ kmeans_result = pyroid.ml.basic.kmeans(data, k=2)
283
+ print(f"K-means centroids: {kmeans_result['centroids']}")
284
+ print(f"K-means clusters: {kmeans_result['clusters']}")
299
285
 
300
286
  # Linear regression
301
- x = [1.0, 2.0, 3.0, 4.0, 5.0]
302
- y = [2.0, 4.0, 5.0, 4.0, 6.0]
303
- result = pyroid.ml.basic.linear_regression(x, y)
304
- print(f"Slope: {result['slope']}")
305
- print(f"Intercept: {result['intercept']}")
306
- print(f"R-squared: {result['r_squared']}")
287
+ # Note: Linear regression expects X as 2D array and y as 1D array
288
+ X = [[1, 1], [1, 2], [2, 2], [2, 3]]
289
+ y = [6, 8, 9, 11]
290
+ regression_result = pyroid.ml.basic.linear_regression(X, y)
291
+ print(f"Linear regression coefficients: {regression_result['coefficients']}")
292
+ print(f"Linear regression intercept: {regression_result['intercept']}")
293
+ print(f"Linear regression R-squared: {regression_result['r_squared']}")
307
294
 
308
295
  # Data normalization
309
- values = [10.0, 20.0, 30.0, 40.0, 50.0]
310
- normalized = pyroid.ml.basic.normalize(values, method="minmax")
311
- print(f"Normalized (min-max): {normalized}")
296
+ normalized_data = pyroid.ml.basic.normalize(data, method="min-max")
297
+ print(f"Normalized data (min-max): {normalized_data}")
312
298
 
313
299
  # Distance matrix
314
- points = [[1.0, 2.0], [3.0, 4.0], [5.0, 6.0]]
315
- distances = pyroid.ml.basic.distance_matrix(points, metric="euclidean")
316
- print(f"Distance matrix: {distances}")
300
+ distance_matrix = pyroid.ml.basic.distance_matrix(data, metric="euclidean")
301
+ print(f"Distance matrix shape: {len(distance_matrix)}x{len(distance_matrix[0])}")
317
302
  ```
318
303
 
319
304
  ## 📊 Performance Considerations
@@ -11,6 +11,20 @@ The benchmark suite provides:
11
11
  - Comprehensive visualizations for marketing materials
12
12
  - Real-world scenario benchmarks that simulate practical use cases
13
13
 
14
+ ## Performance Benchmarks
15
+
16
+ Pyroid significantly outperforms pure Python implementations. Here are some benchmark results:
17
+
18
+ | Operation | Pure Python | NumPy | pyroid | Speedup vs Python | Speedup vs NumPy |
19
+ |-----------|-------------|-------|--------|-------------------|------------------|
20
+ | Sum 10M numbers | Timed out (10s) | 50.15ms | 45.32ms | >220x | 1.11x |
21
+ | Regex replace 1M chars | 250.45ms | N/A | 20.35ms | 12.31x | N/A |
22
+ | Parallel map 1M items | 450.78ms | N/A | 35.67ms | 12.64x | N/A |
23
+ | HTTP fetch 100 URLs | 5000.34ms | N/A | 500.12ms | 10.00x | N/A |
24
+ | Data Processing Pipeline | Timed out (30s) | N/A | 250.34ms | >120x | N/A |
25
+
26
+ > Note: These are example results. Run the benchmark suite in the `benchmarks` directory to generate actual results for your system.
27
+
14
28
  ## Quick Start
15
29
 
16
30
  ### Jupyter Notebook
@@ -60,13 +74,32 @@ For a quick demonstration of Pyroid's performance advantages:
60
74
  python benchmarks/demo.py
61
75
  ```
62
76
 
77
+ ## Benchmark Dashboard
78
+
79
+ The benchmark suite includes a comprehensive dashboard with visualizations that showcase Pyroid's performance advantages:
80
+
81
+ - Performance metrics summary
82
+ - Speedup comparison charts
83
+ - Implementation comparison charts (log and linear scales)
84
+ - Scaling analysis showing how performance scales with dataset size
85
+ - Real-world scenario benchmarks
86
+
87
+ To run the benchmarks and generate the dashboard:
88
+
89
+ ```bash
90
+ python -m benchmarks.run_benchmarks
91
+ ```
92
+
93
+ The dashboard will be available at `benchmarks/dashboard/dashboard.html`.
94
+
95
+ ![Benchmark Dashboard Preview](dashboard/images/speedup_comparison.png)
96
+
63
97
  ## Directory Structure
64
98
 
65
99
  ```
66
100
  benchmarks/
67
101
  ├── benchmark_plan.md # Detailed implementation plan
68
102
  ├── README.md # This file
69
- ├── README_update.md # Template for updating the main README
70
103
  ├── pyroid_benchmarks.ipynb # Jupyter notebook for interactive benchmarks
71
104
  ├── run_benchmarks.py # Main entry point for command-line benchmarks
72
105
  ├── demo.py # Demo script for showcasing performance
@@ -107,7 +140,9 @@ benchmarks/
107
140
  - Task concurrency vs. asyncio.gather
108
141
 
109
142
  5. **Real-world Scenarios**
110
- - Data Processing Pipeline
111
- - Web Scraping and Processing
112
- - Text Processing Pipeline
113
- - Scientific Computing
143
+ - Data Processing Pipeline: ETL operations on large datasets
144
+ - Web Scraping: Concurrent URL fetching and text processing
145
+ - Text Processing: NLP preprocessing tasks
146
+ - Scientific Computing: Statistical analysis and mathematical transformations
147
+
148
+ These benchmarks simulate practical use cases that users can relate to, demonstrating how Pyroid can significantly accelerate your Python code in production environments.