zoukankan      html  css  js  c++  java
  • 命令式编程和指令式编程的区别

    今天看 mxnet 的官网文档,有一篇详细讲解了命令式编程和指令式编程的区别(优缺点)。写的挺好,先贴在这里,回头有空再翻译吧。 原文地址:http://mxnet.incubator.apache.org/api/python/docs/tutorials/packages/gluon/blocks/hybridize.html

    Imperative programming makes use of programming statements to change a program’s state. Consider the following example of simple imperative programming code.

    def add(a, b):
        return a + b
    
    def fancy_func(a, b, c, d):
        e = add(a, b)
        f = add(c, d)
        g = add(e, f)
        return g
    
    fancy_func(1, 2, 3, 4)
    

    As expected, Python will perform an addition when running the statement e = add(a, b), and will store the result as the variable e, thereby changing the program’s state. The next two statements f = add(c, d) and g = add(e, f) will similarly perform additions and store the results as variables.

    Although imperative programming is convenient, it may be inefficient. On the one hand, even if the add function is repeatedly called throughout the fancy_func function, Python will execute the three function calling statements individually, one after the other. On the other hand, we need to save the variable values of e and f until all the statements in fancy_func have been executed. This is because we do not know whether the variables e and f will be used by other parts of the program after the statements e = add(a, b) and f = add(c, d) have been executed.

    Contrary to imperative programming, symbolic programming is usually performed after the computational process has been fully defined. Symbolic programming is used by multiple deep learning frameworks, including Theano and TensorFlow. The process of symbolic programming generally requires the following three steps:

    1. Define the computation process.
    2. Compile the computation process into an executable program.
    3. Provide the required inputs and call on the compiled program for execution.

    In the example below, we utilize symbolic programming to re-implement the imperative programming code provided at the beginning of this section.

    def add_str():
        return '''
    def add(a, b):
        return a + b
    '''
    
    def fancy_func_str():
        return '''
    def fancy_func(a, b, c, d):
        e = add(a, b)
        f = add(c, d)
        g = add(e, f)
        return g
    '''
    
    def evoke_str():
        return add_str() + fancy_func_str() + '''
    print(fancy_func(1, 2, 3, 4))
    '''
    
    prog = evoke_str()
    print(prog)
    y = compile(prog, '', 'exec')
    exec(y)
    

    The three functions defined above will only return the results of the computation process as a string. Finally, the complete computation process is compiled and run using the compile function. This leaves more room to optimize computation, since the system is able to view the entire program during its compilation. For example, during compilation, the program can be rewritten as print((1 + 2) + (3 + 4)) or even directly rewritten as print(10). Apart from reducing the amount of function calls, this process also saves memory.

    A comparison of these two programming methods shows that

    • imperative programming is easier. When imperative programming is used in Python, the majority of the code is straightforward and easy to write. At the same time, it is easier to debug imperative programming code. This is because it is easier to obtain and print all relevant intermediate variable values, or make use of Python’s built-in debugging tools.
    • Symbolic programming is more efficient and easier to port. Symbolic programming makes it easier to better optimize the system during compilation, while also having the ability to port the program into a format independent of Python. This allows the program to be run in a non-Python environment, thus avoiding any potential performance issues related to the Python interpreter.
  • 相关阅读:
    Android客户端消息推送原理简介
    优秀程序员的十个习惯
    能让你成为更优秀程序员的10个C语言资源
    成大事必备9种能力、9种手段、9种心态
    33个优秀的HTML5应用演示 (转)
    Maven学习:Eclipse使用maven构建web项目(转)
    使用fiddler模拟http get
    TLS握手
    风暴英雄 http 302重定向 正在等待游戏模式下载完成
    page template in kentico
  • 原文地址:https://www.cnblogs.com/liushengchieh/p/12844664.html
Copyright © 2011-2022 走看看