使用 Conda + Poetry 进行机器学习项目有意义吗?让我分享一下我(新手)的理解,请指正或赐教:
据我了解,Conda和Poetry有不同的目的,但很大程度上是多余的:
我的想法是同时使用两者并划分它们的角色:让 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 …
我设计了一个程序,基本上,它将几何形状切割成许多小三角形(在"左侧画布"中),对这组三角形应用一些简单的数学变换,并在新的配置中重绘它们.请参阅下面的屏幕截图

为了绘制这些三角形,我使用QPainter::drawPolygon.右边的每个三角形对应左边的三角形,所以我知道我想用什么颜色来绘制它.
到目前为止,很好.即使我画了比这更多的三角形(当我使用更小的三角形来切割形状时),这足够快.
我在程序中添加了一个功能:我可以绘制从图片中提取的三角形而不是普通的三角形:请参阅下面的截屏.

问题是我这样做的方式太慢了.我是这样做的:
QPainter::setPen(QColor)和QPainter::drawPoint(QPoint)绘制像素.我是Qt编程的新手,我对图形一无所知,所以这就是我能想到的.问题是它"不可接受"太慢(paintEvent每个画布大约需要0.15s,而普通三角形则为0.01s).
我跑了一个探查器试图了解发生了什么,我注意到在画布小部件中paintEvent,
QPainter::drawPointQPainter::setPen它似乎QPainter::drawPoint太复杂和缓慢:我只是想让它打印一个给定颜色的像素,就是这样.
我可能已经找到了解决我的问题的方法:存储一个QImage(作为我的画布小部件的成员变量),它代表我希望我的画布显示的整个事物,并在我的paintEvent像素中完全定义它,然后立即绘制它在我结束paintEvent用QPainter::drawImage.我有一个提示,这会更快.但在我重新编写代码之前,我想知道这是否真的是我想要做的.
我希望我没有让你做死!非常感谢您的见解.
我已经在这里发布了这个问题,但由于它可能不是Qt特定的,我想我也可以尝试一下这个机会.我希望这样做并不合适(只要告诉我它是否是这样).
我开发了一个小型的科学计划,可以执行一些数学计算.我试图优化它,以便尽可能快.现在我差不多已经为Windows,Mac和Linux用户部署了它.但我还没能在许多不同的计算机上测试它.
这就是让我烦恼的问题:为了部署Windows,我使用的笔记本电脑上安装了Windows 7和Ubuntu 12.04(双启动).我比较了在这两个系统上运行的应用程序的速度,我惊讶地发现它在Windows上至少慢了两倍!如果存在细微差别,我不会感到惊讶,但是如何解释这种差异呢?
以下是一些准确性:
我很担心Windows上的应用程序会慢得多(2到4次),这真的很奇怪.另一方面,我还没有尝试过使用Windows的其他计算机.不过,你有什么区别吗?
附加信息:一些数据......
即使Windows似乎使用这两个内核,我认为这可能与线程管理有关,这就是为什么:
样本计算n°1(此项启动2个QThreads):
样本计算n°2(此项启动3个QThreads):
样本计算n°3(这个推出6个QThreads):
哪里:
(当然,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)更好地处理线程,或者它不能.我会感到惊讶,怎么可能不知道并记录下来?虽然我想我应该过于谨慎地得出结论,但我只是在一台计算机上进行比较(目前).
我知道这是一个反复出现的问题,但我还没有真正找到有用的答案.我基本上是在寻找acosC++ 函数的快速近似,我想知道我是否能够大大超过标准函数.
但是你们中的一些人可能对我的具体问题有所了解:我正在编写一个我需要非常快速的科学计划.主算法的复杂性归结为计算以下表达式(多次使用不同的参数):
sin( acos(t_1) + acos(t_2) + ... + acos(t_n) )
Run Code Online (Sandbox Code Playgroud)
其中t_i已知的真实(双)数字,并且n非常小(如小于6).我需要至少1e-10的精度.我目前正在使用标准sin和acosC++函数.
你认为我能以某种方式显着提高速度吗?对于那些了解一些数学的人,你认为扩展正弦以获得代数表达式t_i(仅涉及平方根)是明智的吗?
谢谢你的回答.
我正在用Qt编写一个程序,如下所示:

主窗口是Window : QWidget我定义的类.它有一个QGridLayout基本上有1行3列.如您所见,第一列包含一个菜单(这是一个类Menu :QWidget),第二列和第三列各包含一个画布(Canvas : QWidget我也定义了一个类).
我很难弄清楚尺寸是如何工作的.到目前为止,我刚刚为第一列的宽度(在我的窗口的布局中)定义了最小大小来修复菜单的宽度,并且我Canvas在其构造函数中设置了固定大小(如下所示:) setFixedSize(QSize(size_in_pixels, size_in_pixels));.
问题当然是在用户重新调整窗口的情况下这种情况很糟糕.我想我想做的是将我的画布设置sizeHint为size_in_pixels(我的首选尺寸),但这似乎不太可能.我也希望我的画布在任何时候都具有相同的高度和宽度.我一直在阅读Qt文档并尝试了几件事,但我无法提出解决方案.
按照你的方式去做什么?非常感谢您的见解.
有没有办法将 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) 我的 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)