小编Seu*_*eub的帖子

使用 Conda + Poetry 有意义吗?

使用 Conda + Poetry 进行机器学习项目有意义吗?让我分享一下我(新手)的理解,请指正或赐教:

据我了解,CondaPoetry有不同的目的,但很大程度上是多余的:

  • Conda主要是一个环境管理器(实际上不一定是Python),但它也可以管理包和依赖项。
  • Poetry 主要是一个 Python 包管理器(例如pip的升级),但它也可以创建和管理 Python 环境(例如Pyenv的升级)。

我的想法是同时使用两者并划分它们的角色:让 Conda 担任环境管理器,让 Poetry 担任包管理器。我的推理是(听起来)Conda 最适合管理环境,可用于编译和安装非 python 包,尤其是 CUDA 驱动程序(用于 GPU 功能),而 Poetry 作为 Python 包管理器比 Conda 更强大。

通过在 Conda 环境中使用 Poetry,我成功地相当轻松地完成了这项工作。诀窍是不要使用 Poetry 来管理 Python 环境:我没有使用poetry shellor poetry run、 onlypoetry init等命令poetry install(激活 Conda 环境后)。

为了充分披露,我的environment.yml文件(针对Conda)如下所示:

name: N

channels:
  - defaults
  - conda-forge

dependencies:
  - python=3.9
  - cudatoolkit
  - cudnn
Run Code Online (Sandbox Code Playgroud)

我的诗歌.toml …

python machine-learning package conda python-poetry

163
推荐指数
2
解决办法
7万
查看次数

Qt/C++:高效绘图

我设计了一个程序,基本上,它将几何形状切割成许多小三角形(在"左侧画布"中),对这组三角形应用一些简单的数学变换,并在新的配置中重绘它们.请参阅下面的屏幕截图

屏幕帽1

为了绘制这些三角形,我使用QPainter::drawPolygon.右边的每个三角形对应左边的三角形,所以我知道我想用什么颜色来绘制它.

到目前为止,很好.即使我画了比这更多的三角形(当我使用更小的三角形来切割形状时),这足够快.

我在程序中添加了一个功能:我可以绘制从图片中提取的三角形而不是普通的三角形:请参阅下面的截屏.

在此输入图像描述

问题是我这样做的方式太慢了.我是这样做的:

  1. 我浏览了所有三角形
  2. 对于每个三角形,我计算将要显示的每个像素的坐标.
  3. 对于这些像素中的每一个,我计算图片上相应像素的坐标(这是一个简单的数学运算),并检索该像素的颜色.
  4. 我使用QPainter::setPen(QColor)QPainter::drawPoint(QPoint)绘制像素.

我是Qt编程的新手,我对图形一无所知,所以这就是我能想到的.问题是它"不可接受"太慢(paintEvent每个画布大约需要0.15s,而普通三角形则为0.01s).

我跑了一个探查器试图了解发生了什么,我注意到在画布小部件中paintEvent,

  1. 58%的时间花在了 QPainter::drawPoint
  2. 27%的时间花在了 QPainter::setPen

它似乎QPainter::drawPoint太复杂和缓慢:我只是想让它打印一个给定颜色的像素,就是这样.

我可能已经找到了解决我的问题的方法:存储一个QImage(作为我的画布小部件的成员变量),它代表我希望我的画布显示的整个事物,并在我的paintEvent像素中完全定义它,然后立即绘制它在我结束paintEventQPainter::drawImage.我有一个提示,这会更快.但在我重新编写代码之前,我想知道这是否真的是我想要做的.

我希望我没有让你做死!非常感谢您的见解.

c++ graphics qt pixel qpainter

18
推荐指数
2
解决办法
6567
查看次数

提高Qt程序的性能:Windows vs Linux

我已经在这里发布了这个问题,但由于它可能不是Qt特定的,我想我也可以尝试一下这个机会.我希望这样做并不合适(只要告诉我它是否是这样).

我开发了一个小型的科学计划,可以执行一些数学计算.我试图优化它,以便尽可能快.现在我差不多已经为Windows,Mac和Linux用户部署了它.但我还没能在许多不同的计算机上测试它.

这就是让我烦恼的问题:为了部署Windows,我使用的笔记本电脑上安装了Windows 7和Ubuntu 12.04(双启动).我比较了在这两个系统上运行的应用程序的速度,我惊讶地发现它在Windows上至少慢了两倍!如果存在细微差别,我不会感到惊讶,但是如何解释这种差异呢?

以下是一些准确性:

  • 我使程序所做的计算只是一些残酷和愚蠢的数学计算,基本上,它在一个被称为十亿次的循环中计算产品和余弦.另一方面,计算是多线程的:我发布了类似6 QThreads的东西.
  • 笔记本电脑有两个核心@ 1.73Ghz.起初我以为Windows可能没有使用其中一个内核,但后来我查看了处理器活动,根据小图,两个内核都运行100%.
  • 然后我认为用于Windows的C++编译器没有使用Linux的C++编译器自动执行的优化选项(如-O1 -O2)(在发布版本中),但显然它确实如此.

我很担心Windows上的应用程序会慢得多(2到4次),这真的很奇怪.另一方面,我还没有尝试过使用Windows的其他计算机.不过,你有什么区别吗?

附加信息:一些数据......

即使Windows似乎使用这两个内核,我认为这可能与线程管理有关,这就是为什么:

样本计算n°1(此项启动2个QThreads):

  • PC1-windows:7.33s
  • PC1-linux:3.72s
  • PC2-linux:1.36s

样本计算n°2(此项启动3个QThreads):

  • PC1-windows:6.84s
  • PC1-linux:3.24s
  • PC2-linux:1.06s

样本计算n°3(这个推出6个QThreads):

  • PC1-windows:8.35s
  • PC1-linux:2.62s
  • PC2-linux:0.47s

哪里:

  • PC1-windows =我的2核笔记本电脑(@ 1.73Ghz)和Windows 7
  • PC1-linux =我的2核笔记本电脑(@ 1.73Ghz)和Ubuntu 12.04
  • PC2-linux =我的8核笔记本电脑(@ 2.20Ghz)和Ubuntu 12.04

(当然,PC2速度更快并不令人震惊.对我来说不可思议的是PC1-windows和PC1-linux之间的区别).

注意:我也尝试在最近的PC上运行程序(4或8核@~3Ghz,不记得确切)在Mac OS下,速度与PC2-linux相当(或稍快).

编辑:我将在这里回答一些问题我在评论中被问到.

  • 我刚刚在Windows上安装了Qt SDK,所以我想我有最新版本的所有东西(包括MinGW?).编译器是MinGW.Qt版本是4.8.1.

  • 我没有使用优化标志,因为我注意到当我在发布模式(使用Qt Creator)构建时它们会被自动使用.在我看来,如果我写了像QMAKE_CXXFLAGS + = -O1这样的东西,这只会在调试版本中产生影响.

  • 线程的生命周期等:这很简单.当用户单击"计算"按钮时,同时启动2到6个线程(取决于他正在计算的内容),它们在计算结束时终止.没什么太花哨的.每个线程只进行残酷的计算(实际上,除了一个,每30ms进行一次(不那么)小的计算,基本上检查错误是否足够小).

编辑:最新发展和部分答案

以下是一些新的发展,提供了所有这些的答案:

  • 我想确定速度上的差异是否真的与线程有关.所以我修改了程序,以便计算只使用1个线程,这样我们就可以比较"纯C++代码"的性能了.事实证明,现在Windows只比Linux略慢(15%左右).所以我认为差异的一小部分(但并非无意义)是系统固有的,但最大的部分是由于线程管理.

  • 正如在评论中建议的那样(Luca Carlon,感谢您),我尝试使用Microsoft Visual Studio(MSVC)的编译器而不是MinGW构建应用程序.令人惊讶的是,计算(包括所有线程和所有内容)现在"仅"比Linux慢20%到50%!我想我会继续并对此感到满意.我注意到,奇怪的是,"纯C++"计算(只有一个线程)现在甚至更慢(与MinGW相比),这必须考虑整体差异.所以据我所知,MinGW比MSVC略胜一筹,只不过它会处理像白痴一样的线程.

所以,我想我可以做些什么来制作MinGW(理想情况下我宁愿使用它而不是MSVC)更好地处理线程,或者它不能.我会感到惊讶,怎么可能不知道并记录下来?虽然我想我应该过于谨慎地得出结论,但我只是在一台计算机上进行比较(目前).

c++ linux windows performance qt

15
推荐指数
1
解决办法
8812
查看次数

C++(和数学):三角函数的快速逼近

我知道这是一个反复出现的问题,但我还没有真正找到有用的答案.我基本上是在寻找acosC++ 函数的快速近似,我想知道我是否能够大大超过标准函数.

但是你们中的一些人可能对我的具体问题有所了解:我正在编写一个我需要非常快速的科学计划.主算法的复杂性归结为计算以下表达式(多次使用不同的参数):

sin( acos(t_1) + acos(t_2) + ... + acos(t_n) )
Run Code Online (Sandbox Code Playgroud)

其中t_i已知的真实(双)数字,并且n非常小(如小于6).我需要至少1e-10的精度.我目前正在使用标准sinacosC++函数.

你认为我能以某种方式显着提高速度吗?对于那些了解一些数学的人,你认为扩展正弦以获得代数表达式t_i(仅涉及平方根)是明智的吗?

谢谢你的回答.

c++ performance trigonometry

14
推荐指数
2
解决办法
6104
查看次数

Qt:Qwidget大小

我正在用Qt编写一个程序,如下所示:

屏幕截图

主窗口是Window : QWidget我定义的类.它有一个QGridLayout基本上有1行3列.如您所见,第一列包含一个菜单(这是一个类Menu :QWidget),第二列和第三列各包含一个画布(Canvas : QWidget我也定义了一个类).

我很难弄清楚尺寸是如何工作的.到目前为止,我刚刚为第一列的宽度(在我的窗口的布局中)定义了最小大小来修复菜单的宽度,并且我Canvas在其构造函数中设置了固定大小(如下所示:) setFixedSize(QSize(size_in_pixels, size_in_pixels));.

问题当然是在用户重新调整窗口的情况下这种情况很糟糕.我想我想做的是将我的画布设置sizeHintsize_in_pixels(我的首选尺寸),但这似乎不太可能.我也希望我的画布在任何时候都具有相同的高度和宽度.我一直在阅读Qt文档并尝试了几件事,但我无法提出解决方案.

按照你的方式去做什么?非常感谢您的见解.

size qt qwidget

5
推荐指数
1
解决办法
1万
查看次数

std::ostream 到 QString?

有没有办法将 std::ostream 转换为 QString?

请允许我扩展一下它是否有用:我正在用 C++/Qt 编写一个程序,并且我曾经(不)仅使用 std::cout 来处理/调试异常,例如:

std::cout << "Error in void Cat::eat(const Bird &bird): bird has negative weight" << std::endl;
Run Code Online (Sandbox Code Playgroud)

现在我想将错误作为 QString 抛出并稍后捕获它们,所以我现在会写:

throw(QString("Error in void Cat::eat(const Bird &bird): bird has negative weight"));
Run Code Online (Sandbox Code Playgroud)

我的问题是我一直在重载运算符 << 以便我可以将它与许多对象一起使用,例如 a Bird,所以我实际上会写:

std::cout << "Error in void Cat::eat(const Bird &bird): bird " << bird << " has negative weight" << std::endl;
Run Code Online (Sandbox Code Playgroud)

现在有没有办法可以将其作为 QString 抛出?我希望能够写出类似的东西:

std::ostream out;
out << "Error in void Cat::eat(const Bird &bird): bird " << bird << " …
Run Code Online (Sandbox Code Playgroud)

c++ qt exception

5
推荐指数
1
解决办法
4757
查看次数

Qt:组织我的布局和 QSizePolicy

我的 Qt/C++ 程序的主窗口如下所示:

主窗口

正如您在图片中看到的,该窗口主要由以下部分组成:

  • 左边的菜单
  • 两块“画布”

我想要的描述很简单:我希望在调整窗口大小时,两个画布都占用尽可能多的空间,但仍然保持正方形(宽度=高度)。我一直在努力实现这一目标,但没有成功。

让我快速描述一下这些对象:

  • 窗口是Window我创建的派生 QWidget 的类。它有QGridLayout一个布局。
  • 窗口的布局具有三个小部件:左侧菜单LeftMenu *menu和画布Canvas *leftCanvas, *rightCanvas。和LeftMenu都是Canvas派生 QWidget 的自定义类。

(注意:左侧菜单实际上由 3 个不同的小部件(子菜单)组成,窗口还有一个状态栏和一个顶部菜单,但我认为这对我的问题并不重要。)

我一直在“玩”(一点也不开心)QSizePolicy等,试图让画布的大小表现得像我想要的那样(在窗口内尽可能大,但保持高度/宽度比= 1),不成功。让我描述一下我的最新尝试,以防对您有用(如果您已经知道我的问题的解决方案,则不必继续阅读):

我重写了方法heightForWidth()sizeHint()对于minimumSizeHint()Canvas 像这样:

class Canvas : public QWidget
{
    Q_OBJECT

    friend class Window;

public:
    explicit Canvas(Window* window);
    ...

private:
    void resizeEvent(QResizeEvent *resizeEvent) override;
    int heightForWidth(int width) const override {return width;}
    QSize sizeHint() const override
    {
        int size = std::min(width(), height());
        return …
Run Code Online (Sandbox Code Playgroud)

c++ layout qt resize

5
推荐指数
0
解决办法
5426
查看次数