内容简介:Effortlessly write inline C functions in Python source codeInlinec supports gnu-specific c extensions, so you're likely to have reasonable success #includeing glibc headers.Inspired by
Inline C
Effortlessly write inline C functions in Python source code
# coding: inlinec from inlinec import inlinec @inlinec def Q_rsqrt(number): float Q_rsqrt( float number ) { long i; float x2, y; const float threehalfs = 1.5F; x2 = number * 0.5F; y = number; i = * ( long * ) &y; // evil floating point bit level hacking i = 0x5f3759df - ( i >> 1 ); // what the fuck? y = * ( float * ) &i; y = y * ( threehalfs - ( x2 * y * y ) ); // 1st iteration return y; } print(Q_rsqrt(1.234))
Inlinec supports gnu-specific c extensions, so you're likely to have reasonable success #includeing glibc headers.
Inspired by Pyxl
How does this work?
Python has a mechanism for creating custom codecs, which given an input token stream, produce an output token stream. Inlinec consumes the entire token stream, runs a fault-tolerant parser on it ( parso
), finds which function nodes are annotated with an @inlinec
decorator, creates a ctypes
wrapper for the content of the function, and replaces the function body with a call to the ctypes wrapper. The import for the wrapper is lifted to the top of the file. Once this transformation has been made, the source code is re-tokenized and the Python interpreter only sees the transformed source.
So a function like this:
@inlinec def test(): #include<stdio.h> void test() { printf("Hello, world"); }
Gets turned into:
from test_8281231239129310 import lib as test_8281231239129310_lib, ffii as test_8281231239129310_ffi @inlinec def test(): return test_8281231239129310_lib.test()
In theory, this allows inline c functions to be called with a one-time compilation overhead and the same performance characteristics as ctypes -- the underlying FFI library.
Limitations
Note: This is just a proof of concept
gcc -E
Installation
Inlinec requires a C compiler to be installed on the system (tested with GCC and Clang), as well as the python development libraries to be installed (python3-dev). To play around with it in a container you can use the provided Dockerfile, just run docker build, exec into a shell in the container, and you have a working installation of inlinec.
> docker build -t inlinec . && docker run -it inlinec bash
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
网络、群体与市场
大卫·伊斯利(David Esley)、乔恩·克莱因伯格(Jon Kleinberg) / 李晓明、王卫红、杨韫利 / 清华大学出版社 / 2011-10-1 / CNY 69.00
过去十年来,现代社会中复杂的连通性向公众展现出与日俱增的魅力。这种连通性在许多方面都有体现并发挥着强大的作用,包括互联网的快速成长、全球通信的便捷,以及新闻与信息(及传染病与金融危机)以惊人的速度与强度传播的能力。这种现象涉及网络、动机和人们的聚合行为。网络将人们的行为联系起来,使得每个人的决定可能对他人产生微妙的后果。 本书是本科生的入门教材,同时也适合希望进入相关领域的高层次读者。它从交......一起来看看 《网络、群体与市场》 这本书的介绍吧!