| by YoungTimes | No comments

改善程序的性能-C++17 使用 std::string_view避免字符串拷贝

C++中std::string是日常Coding中经常使用的一个类,使用起来非常方便,但是也存在一些弊端。

如下代码,参数传递的过程发生了内存分配(Memory Allocation)和内存拷贝。

再看下面的常用的字符串截取实现:

为了进一步的压榨程序的性能,需要移除掉这些昂贵的字符串内存分配和拷贝操作。C++17中提供了std::string_view可以帮助我们实现这一功能,该类并不持有字符串的拷贝,而是与源字符串共享其内存空间。

string_view构造函数

虽然没有定义参数为std::string的std::string_view函数,下面的[……]

继续阅读

Read More
| by YoungTimes | No comments

稀缺-专注的”得”与管窥的”失”

专注的红利

不知道你有没有这样的经历,越临近截止日期,你完成工作的灵感越多,效率越高,甚至于你工作中的大多数灵感都是在Deadline前几个小时内迸发出来的。

当你专注于Deadline的工作时,似乎所有的”干扰”都不存在了,身旁嘈杂的电视声、客厅大声喧闹的孩子们,这些平时困扰你无法工作的因素似乎一下子被大脑自动屏蔽掉了,脑海中只有一个事情:完成手头马上要到期限的工作。

在稀缺的状态下,人们的注意力会完全集中在紧急的事情上,并将其它事物排除在外,这种专注会让人们从稀缺中获益,让人获得专注红利。

在实际的生活中,稀缺获取专注红利的例子无处不在。比如所有的会议一开始完全没有[……]

继续阅读

Read More
| by YoungTimes | No comments

Git如何修改已提交Commit的commit msg

在使用Git提交代码之后,有时候我们需要修改提交的Commit Msg,这时候需要如何操作呢?

Git中的git commit –amend可以帮助我们实现这个目的。

进入编辑界面:

git 默认的编辑器是Nano编辑器,刚开始我还一脸懵逼,不知道怎么操作。

这里我们只需要直接修改commit msg即可。比如我们修改”add demo commit”为”add demo commit, modify!”。

编辑完成之后,按下ctrl+x键,进入如下界面:

输入”Y”,按回车(enter)键:

至此,commit msg修改完毕。[……]

继续阅读

Read More
| by YoungTimes | No comments

Python中的Yield用法

带有yield的函数在Python中被称之为generator(生成器),也就是说,当你调用这个函数的时候,函数内部的代码并不立即执行 ,这个函数只是返回一个生成器(Generator Iterator)。

1. 使用next方法迭代生成器

generator函数怎么调用呢?答案是next函数。

程序输出:

first iteration:
 0
 second iteration:
 1
 three iteration:
 4
 four iteration:
 9

在函数第一次调用next(gen)函数时,generator函数从开始执行到[……]

继续阅读

Read More
| by YoungTimes | No comments

Python字典(dict)设置默认值

Python中的collections.defaultdict([default_factory[, ]])在设置的字典key第一次出现的时候,自动调用default_factory方法创建一个默认的对象。这个类在实际使用中非常有用,可以帮助我们简化不少问题。

1.合并键值(Key)相同的键值对

如下所示,我们可以把键值(Key)相同的Value合并到一个List中。

程序输出:

[('blue', [2, 4]), ('red', [1]), ('yellow', [1, 3])]

2. 统计字符出现的次数

如下代码所示,当每个字母首次遇到时,d[……]

继续阅读

Read More
| by YoungTimes | No comments

Tensorflow中使用tf.keras.utils.get_file下载数据集

在神经网络中经常需要下载数据集(Dataset),Tensorflow的Keras提供了tf.keras.utils.get_file()函数帮助我们实现数据集下载解压的功能。

函数原型

origin: 数据集(Dataset)的URL路径;

fname: 下载到本地后的文件名称,如果是绝对路径,下载的文件就会存储在这个路径下;

md5_hash: 已废弃,使用file_hash;

file_hash: 文件的md5,用于数据校验;

cache_subdir: 下载到本地的文件存储子目录;

cache_dir: 下载到本地的文件存储目录,默认路径~[……]

继续阅读

Read More
| by YoungTimes | No comments

实现一个python函数装饰器(Decorator)

装饰器本质上是一个 Python 函数或类,它可以让其他函数或类在不需要做任何代码修改的前提下增加额外功能,装饰器的返回值也是一个函数/类对象。它经常用于为已有函数/类添加记录日志、计时统计、性能测试等。

首先定义一个倒计时函数,这个函数的功能非常简单,就是把n从当前值减少到0。

程序输出:

countdown

1.为函数增加一个日志装饰器

假设现在要增强countdown的功能,在函数调用前后自动打印日志,又不想修改函数自身的功能。这种在代码运行期间动态增加功能的方式,称之为装饰器(Decorator)。

能打印日志的decorator,可以定义如下:[……]

继续阅读

Read More
| by YoungTimes | No comments

C++11多线程-主动让出CPU使用权(yield)

在多线程的编程中,有时候一个线程需要等待IO操作或者等待其它某个条件满足,再继续执行。为了达到这样的目的,有时我们会写出如下的代码:

这样代码的问题在于,这个循环判断的操作会使得这个线程占满CPU的时间,造成资源的浪费。我们可以在一次判断结束后,让线程主动让出自己对CPU的使用权,让操作系统调度另一线程继续执行,过一会再回来判断操作是否完成,这样使得该线程的CPU占用时间大大减少。

1. std::this_thread::yield

C++ 11中提供了yield函数帮助我们实现让出CPU占用的目的。

示例代码如下:

程序输出:

waite[......]

继续阅读

Read More
| by YoungTimes | No comments

C++11多线程-线程休眠(sleep)

C++ 11之前并未提供专门的休眠函数。c语言的sleep、usleep其实都是系统提供的函数,不同的系统函数的功能还有些差异。

在Windows系统中,sleep的参数是毫秒。

在类Unix系统中,sleep()函数的单位是秒。

从C++11开始,中C++标准库提供了专门的线程休眠函数,使得你的代码可以独立于不同的平台。

1. 让线程休眠一段时间

std::this_thread::sleep_for用于Block当前线程一段时间。

sleep的时间间隔从纳秒到小时都有具体的定义。

比如我们想要一个线程休眠100ms。

[……]

继续阅读

Read More
| by YoungTimes | No comments

深度卷积生成对抗网络(DCGAN)

1.GAN的基本原理

GAN的基本原理其实非常简单,它包含两个网络,G网络(Generator)和D网络(Discriminator)。G网络的目标是尽量生成真实的图片去欺骗判别网络D,D网络的目标是尽量把G网络生成的图片和真实的图片分别开来。

最理想的结束状态是,G网络可以生成足以“以假乱真”的图片,而D网络,它难以判定G生成的图片究竟是不是真实的。

先看以下枯燥的数学语言描述下GAN的核心原理:

上述公式中:x表示真实图片,z表示输入G网络的随机噪声,而G(z)表示G网络生成的图片;D(x)表示D网络判断真实图片是否真实的概率(因为x就是真实的,所以对于D来[……]

继续阅读

Read More