图片由沙龙丧心病狂的Unsplash

如果标准并不是最好的

最简单的解决方案并不总是最好的

在研究过程中,在某种程度上,我需要评估一个特定的测量(多样性指数)大矩形矩阵。这不是有关这个故事,但我所说的单细胞RNA-Sequencing数据。

在练习这是有用的估计的数量多样化的组件发现在人群中(例如,数量的不同的单词书)或许可以解释[3]的出现特定的幂律分布在许多复杂系统(1、2、4)。

熊猫

测量指标的问题可以解决给定的数据存储在一个文件中一行Python使用著名的熊猫库。

pd.read_csv ()。应用(lambda x: len(np.unique(x)))

Ths是对于许多应用程序,很直接要求任何努力实现它的数据科学家,但是. .

我需要测量这个量大表(单细胞数据几十万样本),与熊猫这个简单的任务是缓慢的。熊猫方法所需时间将数据加载到内存中,然后评估函数对每一行。

更快的方法是处理行就加载到内存,然后丢弃它们(节省内存的奖金),所以我从scartch实现它。

一个c++的解决方案

我解决这个问题用标准模板库和提高。

这个想法

我们的想法是,正如上面提到的,解析就行。我定义了一个线程哪一个该文件并存储它在一个缓冲和其他线程解析可用的台词。因为我估计指标列上,我需要多个线程解析不同的直线在同一时间重叠的数组,这是解决互斥锁每列(一个)。

绑定

使用Boost.Python我能够我的新创建的模块加载到一个python模块,所以它会像熊猫一样容易使用它。

这是绑定一个函数的一个例子

# include <刺激/ python.hpp >BOOST_PYTHON_FUNCTION_OVERLOADS (loadFile_overloads loadFile <时间> 1、3)BOOST_PYTHON_MODULE (pydiversity) {
名称空间bp =提高::python;
英国石油公司使用名称空间;
def(“多样性”,loadFile <时间>,loadFile_overloads (bp: args(“文件”、“nThreads”、“详细”、“out_filename”)));
}

它可以很容易地在python中使用进口

进口pydiversity
pydiversity.diversity (“mainTable.csv”)

基准

我测量了时间解析表十成千上万的列和20000行(你可以猜为什么),看来我的解决方案快60%简单的熊猫应用。此外,我的解决方案可以利用机器的全功率和运行它多核机加速的90%对Python实现。

  • Python使用熊猫(8.05±0,11)
  • Python绑定单线程:(3.3±0,4)
  • 与多线程Python绑定:(0 71±0 14)
  • 纯c++单线程:(3.2±0,3)
  • 纯c++多线程:(0 66±0 11)

加快

由于我的解决方案可以多流我测量了与越来越多的线程获得运行时。我测量了加速(1次/(最慢时间))6-core机器上,有一个apprectiable收益。

加速6-core机器上。作者形象。

结论

除了这个问题,我希望给别人总是进一步调查和灵感在可能的情况下实现更高效的解决方案。很多次我听到“因为这是Python的方式”,但作为数据科学家,我认为我们应该提高自己,总是实施新的解决方案,我们不应该每次都接受最简单的解决方案。

代码

引用

  1. Lazzardi年代,山谷F, Mazzolini,等紧急统计法律单细胞转录组数据。(2021)bioRxiv 2021.06.16.448706。

2。Mazzolini, Gherardi M, Caselle M,等数据共享组件的复杂组件系统。(2018)物理评论X

3所示。Mazzarisi O, de Azevedo-Lopes Arenzon JJ, Corberi F最大多样性和Zipf定律。(2021)arXiv: 210309143

4所示。奥特曼如Gerlach M统计法律语言学。(2016)激飞国际出版。

为生命科学博士生在复杂系统。对物理感兴趣,毫升应用、社区检测和编码。

Baidu
map