Added speedup project code.
This commit is contained in:
		
							
								
								
									
										65
									
								
								content/posts/python-speedup/code/.clang-format
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										65
									
								
								content/posts/python-speedup/code/.clang-format
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,65 @@
 | 
			
		||||
---
 | 
			
		||||
Language: Cpp
 | 
			
		||||
BasedOnStyle: LLVM
 | 
			
		||||
 | 
			
		||||
AccessModifierOffset: -2
 | 
			
		||||
AlignAfterOpenBracket: Align
 | 
			
		||||
AlignConsecutiveMacros: true
 | 
			
		||||
AlignConsecutiveAssignments: true
 | 
			
		||||
AlignEscapedNewlines: Right
 | 
			
		||||
AlignOperands: false
 | 
			
		||||
AlignTrailingComments: true
 | 
			
		||||
AllowAllArgumentsOnNextLine: true
 | 
			
		||||
AllowAllConstructorInitializersOnNextLine: true
 | 
			
		||||
AllowAllParametersOfDeclarationOnNextLine: true
 | 
			
		||||
AllowShortBlocksOnASingleLine: true
 | 
			
		||||
AllowShortCaseLabelsOnASingleLine: true
 | 
			
		||||
AllowShortFunctionsOnASingleLine: Empty
 | 
			
		||||
AllowShortIfStatementsOnASingleLine: Never
 | 
			
		||||
AllowShortLambdasOnASingleLine: All
 | 
			
		||||
AllowShortLoopsOnASingleLine: false
 | 
			
		||||
AlwaysBreakAfterDefinitionReturnType: None
 | 
			
		||||
AlwaysBreakAfterReturnType: None
 | 
			
		||||
AlwaysBreakBeforeMultilineStrings: false
 | 
			
		||||
AlwaysBreakTemplateDeclarations: Yes
 | 
			
		||||
BreakBeforeBraces: Attach
 | 
			
		||||
BreakBeforeTernaryOperators: false
 | 
			
		||||
BreakConstructorInitializers: AfterColon
 | 
			
		||||
ColumnLimit: 180
 | 
			
		||||
CompactNamespaces: false
 | 
			
		||||
ConstructorInitializerAllOnOneLineOrOnePerLine: false
 | 
			
		||||
ExperimentalAutoDetectBinPacking: false
 | 
			
		||||
FixNamespaceComments: false
 | 
			
		||||
IncludeBlocks: Preserve
 | 
			
		||||
IndentCaseLabels: true
 | 
			
		||||
IndentWidth: 4
 | 
			
		||||
PointerAlignment: Left
 | 
			
		||||
ReflowComments: false
 | 
			
		||||
SortIncludes: false
 | 
			
		||||
SortUsingDeclarations: false
 | 
			
		||||
SpaceAfterCStyleCast: false
 | 
			
		||||
SpaceAfterLogicalNot: false
 | 
			
		||||
SpaceAfterTemplateKeyword: true
 | 
			
		||||
SpaceBeforeCtorInitializerColon: true
 | 
			
		||||
SpaceBeforeInheritanceColon: true
 | 
			
		||||
SpaceBeforeParens: ControlStatements
 | 
			
		||||
SpaceBeforeRangeBasedForLoopColon: true
 | 
			
		||||
SpaceInEmptyParentheses: false
 | 
			
		||||
SpacesBeforeTrailingComments: 1
 | 
			
		||||
SpacesInAngles: false
 | 
			
		||||
SpacesInCStyleCastParentheses: false
 | 
			
		||||
SpacesInContainerLiterals: false
 | 
			
		||||
SpacesInParentheses: false
 | 
			
		||||
SpacesInSquareBrackets: false
 | 
			
		||||
Standard: Auto
 | 
			
		||||
TabWidth: 4
 | 
			
		||||
UseTab: Never
 | 
			
		||||
 | 
			
		||||
AllowShortEnumsOnASingleLine: false
 | 
			
		||||
 | 
			
		||||
BraceWrapping:
 | 
			
		||||
  AfterEnum: false
 | 
			
		||||
 | 
			
		||||
AlignConsecutiveDeclarations: AcrossEmptyLines
 | 
			
		||||
 | 
			
		||||
NamespaceIndentation: All
 | 
			
		||||
							
								
								
									
										25
									
								
								content/posts/python-speedup/code/.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										25
									
								
								content/posts/python-speedup/code/.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@ -0,0 +1,25 @@
 | 
			
		||||
# Created by https://gitignore.org
 | 
			
		||||
# CMake.gitignore
 | 
			
		||||
*.log
 | 
			
		||||
.cache/
 | 
			
		||||
*.so
 | 
			
		||||
 | 
			
		||||
CMakeLists.txt.user
 | 
			
		||||
CMakeCache.txt
 | 
			
		||||
CMakeFiles
 | 
			
		||||
CMakeScripts
 | 
			
		||||
Testing
 | 
			
		||||
Makefile
 | 
			
		||||
cmake_install.cmake
 | 
			
		||||
install_manifest.txt
 | 
			
		||||
compile_commands.json
 | 
			
		||||
CTestTestfile.cmake
 | 
			
		||||
_deps
 | 
			
		||||
CMakeUserPresets.json
 | 
			
		||||
 | 
			
		||||
# CLion
 | 
			
		||||
#  JetBrains specific template is maintained in a separate JetBrains.gitignore that can
 | 
			
		||||
#  be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore
 | 
			
		||||
#  and can be added to the global gitignore or merged into this file.  For a more nuclear
 | 
			
		||||
#  option (not recommended) you can uncomment the following to ignore the entire idea folder.
 | 
			
		||||
#cmake-build-*
 | 
			
		||||
							
								
								
									
										34
									
								
								content/posts/python-speedup/code/CMakeLists.txt
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										34
									
								
								content/posts/python-speedup/code/CMakeLists.txt
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,34 @@
 | 
			
		||||
cmake_minimum_required(VERSION 3.30)
 | 
			
		||||
 | 
			
		||||
project(
 | 
			
		||||
	pyspeed
 | 
			
		||||
	VERSION 0.1.0
 | 
			
		||||
	DESCRIPTION "C++ extension for Python speedup"
 | 
			
		||||
	LANGUAGES CXX
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
file(GLOB_RECURSE SRCFILES "src/*.cpp")
 | 
			
		||||
 | 
			
		||||
set(CMAKE_EXPORT_COMPILE_COMMANDS true)
 | 
			
		||||
set(CMAKE_EXECUTABLE_ENABLE_EXPORTS TRUE)
 | 
			
		||||
 | 
			
		||||
set(CMAKE_CXX_STANDARD 23)
 | 
			
		||||
add_compile_options(
 | 
			
		||||
		-Wall
 | 
			
		||||
		-Wextra
 | 
			
		||||
		-Wpedantic
 | 
			
		||||
		-Wno-unused-parameter
 | 
			
		||||
		-Wno-unused-value
 | 
			
		||||
		-Wno-missing-field-initializers
 | 
			
		||||
		-Wno-gnu-zero-variadic-macro-arguments
 | 
			
		||||
		-Wno-narrowing
 | 
			
		||||
		-Wno-pointer-arith
 | 
			
		||||
		-Wno-clobbered
 | 
			
		||||
		-fmacro-prefix-map=${CMAKE_SOURCE_DIR}/=
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
find_package(PkgConfig REQUIRED)
 | 
			
		||||
pkg_check_modules(python REQUIRED IMPORTED_TARGET python3)
 | 
			
		||||
 | 
			
		||||
add_library(speedup SHARED src/speedup.cpp)
 | 
			
		||||
target_link_libraries(speedup PkgConfig::python)
 | 
			
		||||
							
								
								
									
										56
									
								
								content/posts/python-speedup/code/src/speedup.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										56
									
								
								content/posts/python-speedup/code/src/speedup.cpp
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,56 @@
 | 
			
		||||
#include <Python.h>
 | 
			
		||||
 | 
			
		||||
PyObject* my_stat_counter(PyObject* self, PyObject* args) {
 | 
			
		||||
    size_t to_add;
 | 
			
		||||
    if (!PyArg_ParseTuple(args, "k", &to_add)) {
 | 
			
		||||
        return (PyObject*)NULL;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // PyObject* state = Py_None;
 | 
			
		||||
    auto mod_shit = (size_t*)PyModule_GetState(self);
 | 
			
		||||
    if (*mod_shit == 0) {
 | 
			
		||||
        *mod_shit = 1;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    *mod_shit += to_add;
 | 
			
		||||
 | 
			
		||||
    return PyLong_FromSize_t(*mod_shit);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static PyMethodDef MyStatMethods[] = {
 | 
			
		||||
    {
 | 
			
		||||
        "my_stat_counter",
 | 
			
		||||
        my_stat_counter,
 | 
			
		||||
        METH_VARARGS,
 | 
			
		||||
        "Python interface for speedup",
 | 
			
		||||
    },
 | 
			
		||||
    {NULL, NULL, 0, NULL},
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
#ifdef Py_mod_exec
 | 
			
		||||
static struct PyModuleDef_Slot mod_slots[] = {
 | 
			
		||||
    {Py_mod_multiple_interpreters, Py_MOD_PER_INTERPRETER_GIL_SUPPORTED},
 | 
			
		||||
    {Py_mod_gil, Py_MOD_GIL_NOT_USED},
 | 
			
		||||
    {0, NULL},
 | 
			
		||||
};
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
static struct PyModuleDef mod_def = {
 | 
			
		||||
    PyModuleDef_HEAD_INIT,                 /* m_base */
 | 
			
		||||
    "speedup",                             /* m_name */
 | 
			
		||||
    "Python interface for speedup module", /* m_doc */
 | 
			
		||||
    sizeof(size_t),                        /* m_size */
 | 
			
		||||
    MyStatMethods,                         /* m_methods */
 | 
			
		||||
#ifdef Py_mod_exec
 | 
			
		||||
    mod_slots, /* m_slots */
 | 
			
		||||
#else
 | 
			
		||||
    NULL,
 | 
			
		||||
#endif
 | 
			
		||||
    NULL, /* m_traverse */
 | 
			
		||||
    NULL, /* m_clear */
 | 
			
		||||
    NULL, /* m_free */
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
PyMODINIT_FUNC PyInit_libspeedup(void) {
 | 
			
		||||
    return PyModuleDef_Init(&mod_def);
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										35
									
								
								content/posts/python-speedup/code/test.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										35
									
								
								content/posts/python-speedup/code/test.py
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,35 @@
 | 
			
		||||
from concurrent import interpreters
 | 
			
		||||
from libspeedup import my_stat_counter
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def calc():
 | 
			
		||||
    my_stat_counter(2)
 | 
			
		||||
    my_stat_counter(2)
 | 
			
		||||
    a = my_stat_counter(2)
 | 
			
		||||
    print(a)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def main():
 | 
			
		||||
    my_stat_counter(1)
 | 
			
		||||
    my_stat_counter(1)
 | 
			
		||||
    int1 = interpreters.create()
 | 
			
		||||
    int2 = interpreters.create()
 | 
			
		||||
    int3 = interpreters.create()
 | 
			
		||||
 | 
			
		||||
    t1 = int1.call_in_thread(calc)
 | 
			
		||||
    t2 = int2.call_in_thread(calc)
 | 
			
		||||
    t3 = int3.call_in_thread(calc)
 | 
			
		||||
 | 
			
		||||
    t1.join()
 | 
			
		||||
    t2.join()
 | 
			
		||||
    t3.join()
 | 
			
		||||
 | 
			
		||||
    int1.close()
 | 
			
		||||
    int2.close()
 | 
			
		||||
    int3.close()
 | 
			
		||||
 | 
			
		||||
    print(my_stat_counter(1))
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
if __name__ == "__main__":
 | 
			
		||||
    main()
 | 
			
		||||
							
								
								
									
										17
									
								
								content/posts/python-speedup/index.md
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										17
									
								
								content/posts/python-speedup/index.md
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,17 @@
 | 
			
		||||
+++
 | 
			
		||||
title = "Python speedup with rust"
 | 
			
		||||
weight = 1
 | 
			
		||||
date = "2025-09-02"
 | 
			
		||||
 | 
			
		||||
[extra]
 | 
			
		||||
preview_image = "posts/kube-intro/preview.png"
 | 
			
		||||
+++
 | 
			
		||||
 | 
			
		||||
<!--  -->
 | 
			
		||||
 | 
			
		||||
## Why care
 | 
			
		||||
 | 
			
		||||
It's no secret that python is slow. Because it's interpreted language.
 | 
			
		||||
But there is a solution for that problem. 
 | 
			
		||||
 | 
			
		||||
Python has ABI for loading modules built with C.
 | 
			
		||||
		Reference in New Issue
	
	Block a user