python - 分析回调到 Python 的 C 扩展
问题描述
假设出于讨论的目的,我有一个这样的函数:
PyObject* tuple_from_dict(PyObject* ftype, PyObject* factory, PyObject* values) {
PyObject* ttype = PyTuple_GetItem(factory, 1);
PyObject* fmapping = PyTuple_GetItem(factory, 2);
PyObject* key;
PyObject* value;
Py_ssize_t pos = 0;
Py_ssize_t arg_len = 0;
Py_ssize_t field;
PyObject* result;
if (PyDict_Size(fmapping) == 0) {
result = PyObject_Call(ttype, PyTuple_New(0), NULL);
Py_INCREF(result);
return result;
}
while (PyDict_Next(fmapping, &pos, &key, &value)) {
field = PyLong_AsSsize_t(value);
if (field > arg_len) {
arg_len = field;
}
}
PyObject* args = PyTuple_New(arg_len + 1);
pos = 0;
while (pos < arg_len + 1) {
Py_INCREF(Py_None);
PyTuple_SetItem(args, pos, Py_None);
pos++;
}
pos = 0;
while (PyDict_Next(values, &pos, &key, &value)) {
field = PyLong_AsSsize_t(PyDict_GetItem(fmapping, key));
PyTuple_SetItem(args, field, value);
}
result = PyObject_Call(ttype, args, NULL);
if (result) {
Py_INCREF(result);
}
return result;
}
它到底做了什么并不重要,重要的是它调用了PyObject_Call(...)
,我怀疑这很慢。但是,我们正在谈论的缓慢在每次调用的基础上并不明显(代码整体确实每 1/100 秒有数千次调用)。所以......我需要一个聚合,或者某种以非常高的精度测量时间的方法(所以,clock_t
它似乎不是一个很好的精度水平)。
如果该解决方案仅适用于 Linux,那也没关系。如果我能以某种方式减慢一切速度,但对所讨论的时间进行更精确的测量,那也没关系。
解决方案
clock_gettime()
有用吗?它是高分辨率计时器的 POSIX 接口。这篇文章提供了这个示例用法。
#include <iostream>
#include <time.h>
using namespace std;
timespec diff(timespec start, timespec end);
int main()
{
timespec time1, time2;
int temp;
clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &time1);
for (int i = 0; i< 242000000; i++)
temp+=temp;
clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &time2);
cout<<diff(time1,time2).tv_sec<<":"<<diff(time1,time2).tv_nsec<<endl;
return 0;
}
timespec diff(timespec start, timespec end)
{
timespec temp;
if ((end.tv_nsec-start.tv_nsec)<0) {
temp.tv_sec = end.tv_sec-start.tv_sec-1;
temp.tv_nsec = 1000000000+end.tv_nsec-start.tv_nsec;
} else {
temp.tv_sec = end.tv_sec-start.tv_sec;
temp.tv_nsec = end.tv_nsec-start.tv_nsec;
}
return temp;
}
推荐阅读
- java - 无法获取订阅者子账户 SAP Cloud 平台 -CF 的目的地
- raspberry-pi3 - 如何在 pi3 上安装签名版本?
- css - react-native:仅适用于 android/ios 的平台特定样式代码
- typo3 - 如何在 TYPO3 9.5.5 中正确设置 tx-news 的 url-routing?
- php - PHP - 使用 SESSION 的权限问题
- java - Selenium:无法单击通过 JS 和简单格式化方式完成查找元素时找到的按钮
- r - Linux RStudio 版本似乎在寻找 Windows 插件
- blockchain - 在 mac 上执行 runnodes 命令时出错
- android - 通过 SQL Server Express 将 Android 应用程序连接到 MySQL
- laravel - 在不使用 foreach 的情况下将值传递给刀片