- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我真的不知道怎么问这个问题,但我会尽量说清楚。
我正在计时来自 python 的 C++ 函数调用。 C++ 函数用 cython 包装。我目前正在计时 cython 函数的 python 调用,我得到了 52.9 毫秒 time.time()
.另一方面,我用 C++ std::chrono::high_resolution_clock
对整个 C++ 函数进行计时。图书馆。
事实是,我在 C++ 中测量了 17.1 毫秒。
C++函数是这样声明的vector<float> cppfunc(vector<float> array, int a, int b, int c);
并且是 A 类方法。
cython代码只调用C++类方法。该 vector 包含大约 320k 个元素。
我想知道这两个测量时间是否可以这样比较?如果可以,什么可以解释这种差距?如果不是,我应该使用哪种计时工具?
Edit1:(评论中的链接)两个时序库都足够精确以用于我的用例(我的 arch 上的 cpp 为 10e-9,python 为 10e-6)。
Edit2: 添加了简化代码来说明我的观点。使用此代码,python 调用持续时间(~210 毫秒)是实习生 cpp 持续时间(~28 毫秒)的 8 倍。
// example.cpp
#include "example.h"
#include <iostream>
#include <chrono>
std::vector<float> wrapped_function(std::vector<float> array)
{
auto start = std::chrono::high_resolution_clock::now();
std::vector<float> result;
for (int i = 0; i < (int) array.size(); i++) {
result.push_back(array[i] / 1.1);
}
auto end = std::chrono::high_resolution_clock::now();
std::chrono::duration<float> duration = end - start;
printf("Within duration: %.5f\n", duration.count());
return result;
}
// example.h
#ifndef __EXAMPLE_H_
#define __EXAMPLE_H_
#include <vector>
std::vector<float> wrapped_function(std::vector<float> array);
#endif
# example_wrapper.pxd
from libcpp.vector cimport vector
cdef extern from "example.h":
vector[float] wrapped_function(vector[float])
# example_wrapper.pyx
from example_wrapper cimport wrapped_function
def cython_wrap(array):
return wrapped_function(array)
# setup.py
from distutils.core import setup
from distutils.extension import Extension
from Cython.Distutils import build_ext
setup(
cmdclass = {"build_ext": build_ext},
ext_modules = [
Extension(name="example_wrapper",
sources=["example_wrapper.pyx", "example.cpp"],
include_dirs=["/home/SO/"],
language="c++",
extra_compile_args=["-O3", "-Wall", "-std=c++11"]
)
]
)
# test.py
import example_wrapper
from time import time
array = [i for i in range(1000000)]
t0 = time()
result = example_wrapper.cython_wrap(array)
t1 = time()
print("Wrapped duration: {}".format(t1 - t0))
最佳答案
很明显区别是cython的开销,但为什么这么大?
包装函数的调用比看上去要复杂:
def cython_wrap(array):
return wrapped_function(array)
array
是一个整数列表,wrapped_function
需要浮点 vector ,所以 cython 会自动创建一个 vector 并用列表中的值填充它。
wrapped_function
返回一个浮点 vector ,但为了被 python 使用,它必须转换为 python-list。 cython 再次自动创建一个 python-list 并用 python-floats 填充它,构建起来非常昂贵并且对应于返回 vector 中的 float 。
如您所见,正在进行大量复制,这解释了您观察到的开销。
Here是从 c++ 容器转换为 python 时 cython 自动应用的一组规则。
另一个问题:您正在按值传递 vector array
,因此必须复制它。您的 c++ 代码时间不包括此复制,因此有点不公平。
您应该通过常量引用传递 vector ,即
... wrapped_function(const std::vector<float> &array)
还有一件事:您返回一个可能也将被复制的 vector ,并且此复制时间再次不包含在您的 c++ 计时中。然而,所有现代编译器都应用返回值优化,所以这在这里不是问题。
关于c++ - 用 cython 包装的 C++ 函数的计时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50587684/
正在尝试创建一个 python 包。似乎有效,但我收到警告。我的 setup.py 是: #! /usr/bin/env python from distutils.core import setup
我导入了一个数据类型 X ,定义为 data X a = X a 在本地,我定义了一个通用量化的数据类型,Y type Y = forall a. X a 现在我需要定义两个函数, toY 和 fro
我似乎无法让编译器让我包装 Tokio AsyncRead: use std::io::Result; use core::pin::Pin; use core::task::{Context, Po
我有两个函数“a”和“b”。当用户上传文件时,“b”被调用。 “b”重命名文件并返回新文件名。之后应该编辑该文件。像这样: def a(): edits file def b(): r
我使用 Entity Framework 作为我的 ORM,我的每个类都实现了一个接口(interface),该接口(interface)基本上表示表结构(每个字段一个只读属性)。这些接口(inter
有没有办法打开一个程序,通常会打开一个新的jframe,进入一个现有的jframe? 这里是解释,我下载了一个java游戏,其中一个是反射游戏,它在一个jframe中打开,框架内有一堆子面板,我想要做
我想要下面的布局 | AA BBBBBBB | 除非没有足够的空间,在这种情况下 | AA | | BBBBBBB | 在这种情况下,A 是复选框,B 是复选框旁边的 Text
我正在尝试以不同的方式包装我的网站,以便将背景分为 2 部分。灰色部分是主要背景,还有白色部分,它较小并包装主要内容。 基本上我想要this看起来像this . 我不太确定如何添加图像来创建阴影效果,
我正在使用 : 读取整数文件 int len = (int)(new File(file).length()); FileInputStream fis = new FileInputStream(f
我使用 maven 和 OpenJDK 1.8 打包了一个 JavaFX 应用程序我的 pom.xml 中的相关部分: maven-assembly-plugin
我正在使用两个不同的 ItemsControl 来生成一个按钮列表。
我有一个情况,有一个变量会很方便,to , 可以是 TimerOutput或 nothing .我有兴趣提供一个采用与 @timeit 相同参数的宏来自 TimerOutputs(例如 @timeit
我正在尝试包装一个名为 content 的 div与另一个具有不同背景的 div。 但是,当将“margin-top”与 content 一起使用时div,似乎包装 DIV 获得了边距顶部而不是 co
文档不清楚,它似乎允许包装 dll 和 csproj 以在 Asp.Net Core 5 应用程序中使用。它是否允许您在 .Net Core 5 网站中使用针对 .Net Framework 4.6
我被要求开发一个层,该层将充当通用总线,而不直接引用 NServiceBus。到目前为止,由于支持不引人注目的消息,这并不太难。除了现在,我被要求为 IHandleMessages 提供我们自己的定义
我正在尝试包装 getServersideProps使用身份验证处理程序函数,但不断收到此错误:TypeError: getServerSideProps is not a function我的包装看
我有一个项目,它在特定位置(不是/src/resources)包含资源(模板文件)。我希望在运行 package-bin 时将这些资源打包。 我看到了 package-options 和 packag
我正在寻找打印从一系列对象中绘制的 div。我可以通过使用下面的管道语法来实现这一点。 each i, key in faq if (key == 0) |
我在 Meteor.js“main.js - Server”中有这个方法。 Meteor.methods({ messageSent: function (message) { var a
我注意到,如果我的自定义Polymer 1.x元素的宽度比纸张输入元素上的验证错误消息的宽度窄,那么错误将超出自定义元素的右边界。参见下图: 有没有一种机制可以防止溢出,例如在到达自定义元素的边界时自
我是一名优秀的程序员,十分优秀!