Hướng dẫn python and c++ reddit - python và c ++ reddit

Ví dụ: lấy hai bit mã tương tự này tìm thấy yếu tố chính lớn nhất của một số:

Mã Python:

from itertools import cycle
import sys


def largest_prime_factor[n: int] -> int:
    basis = [2, 3, 5]
    max_p = None
    for p in basis:
        e = 0
        while n%p == 0:
            n //= p
            e += 1
        if e:
            max_p = p

    inc = cycle[[4, 2, 4, 2, 4, 6, 2, 6]]
    p = 7
    while n > 1:
        e = 0
        while n%p == 0:
            n //= p
            e += 1
        if e:
            max_p = p
        p += next[inc]
    return max_p


if __name__ == '__main__':
    if len[sys.argv] != 2:
        print["Exactly one argument is required."]
        sys.exit[1]

    n = int[sys.argv[1]]
    print[f'Largest prime factor of {n} is {largest_prime_factor[n]}']

Mã C:

#include 
#include 
#include 

typedef uint64_t u64;

u64 remove_divisor[u64 n, u64 d] {
  while[n%d == 0]
    n /= d;
  return n;
}


u64 largest_prime_factor[u64 n] {
  u64 max_p;

  // Special case for 2
  int e = 0;
  while[![n&1]]{
    n >>= 1;
    e++;
  }

  if[e]
    max_p = 2;

  u64 n_reduced = remove_divisor[n, 3];
  if[n > n_reduced]{
    max_p = 3;
    n = n_reduced;
  }

  n_reduced = remove_divisor[n, 5];
  if[n > n_reduced]{
    max_p = 5;
    n = n_reduced;
  }

  static u64 inc[] = {4, 2, 4, 2, 4, 6, 2, 6};
  u64 *inc_p = &inc[0];
  u64 *end_p = &inc[7];

  u64 p = 7;
  while[n > 1] {
    n_reduced = remove_divisor[n, p];
    if[n > n_reduced]{
      max_p = p;
      n = n_reduced;
    }
    
    p += *[inc_p];
    if[inc_p == end_p]
      inc_p = &inc[0];
    else
      inc_p++;
  }

  return max_p;
}


int main[int argc, char **argv] {
  if[argc != 2] {
    puts["Exactly one argument is required.\n"];
    return 1;
  }
  u64 num = strtoull[argv[1], NULL, 10];
  printf["Largest prime factor of %llu is %llu.\n", num, largest_prime_factor[num]];
  return 0;
}

Với đầu vào 200000025000000077, Python mất 50 giây và C mất nửa giây trên máy của tôi, vì vậy nhanh hơn 100 lần. Rất vui vì tôi quyết định học C nghiêm túc hơn.

EDIT: Thật thú vị khi lưu ý rằng Pypy mang thời gian chạy xuống 4,7 giây [x86_64 Python Jit chạy trên Rosetta 2], điều này làm cho tốc độ tăng tốc chỉ 10 lần.

Làm điều đó nếu bạn muốn. Tôi không hiểu tại sao nó thậm chí là một câu hỏi.

  1. Có một API trong C mà bạn có thể sử dụng để tương tác với các đối tượng Python từ mã C, cùng một API mà Python sử dụng nội bộ để bootstrap trong nhiều trường hợp. Có những hướng dẫn tốt trong các tài liệu Python chính thức về cách tạo một mô -đun Python một cách chi tiết, nhưng tổng quan về cách thực hiện là:

  2. Tạo tệp nguồn C

  3. Bao gồm tệp tiêu đề Python.h, tồn tại trên bất kỳ hệ thống nào với trình thông dịch Python được cài đặt.

  4. Có các chức năng và macro trong tiêu đề Python.h cho phép bạn tạo một mô -đun Python "đối tượng", có thể được nhập và để chỉ định các hàm nào phải là một phần của đối tượng đó và đối với mỗi chức năng, bạn có thể chỉ định đó là Python Chữ ký chức năng, mặc dù từ góc độ C, tất cả các giá trị được truyền vào hàm Python chỉ là các đối tượng Python [con trỏ đến một cấu trúc pyobject]

  5. Cấu trúc PyObject là loại dữ liệu cơ bản bên trong trình thông dịch Python. Nó là một cấu trúc đa hình, thực sự gọn gàng. Bạn có thể thực hiện đa hình và định hướng đối tượng bên trong C với một số thủ thuật đúc cấu trúc gọn gàng, và đó là những gì Python làm. Do đó, có các macro để chuyển đổi cấu trúc pyobject đi vào chức năng của bạn thành một cấu trúc pylistobject, và sau đó có nhiều API C để thực hiện những gì bạn cần làm vào danh sách [nối, chèn, xóa, v.v.]

Bây giờ, một khi mã C của bạn được ghi lên, bạn cần phải biên dịch nó. Điều này sẽ rất khó khăn, ngoại trừ việc setuptools của Python [setup.py] có các tiện ích để bao gồm các phần mở rộng C trong thư viện của bạn. Vì vậy, bạn chỉ có thể biên dịch nó thông qua công cụ đó trong khi chủ yếu bỏ qua sự phức tạp của việc biên dịch và liên kết thủ công.

Tôi không có nghĩa là khắc nghiệt. Một điều tôi đã học được trong suốt cuộc đời là tôi đã lãng phí quá nhiều thời gian để tự hỏi về mọi thứ thay vì làm mọi việc. Sống cuộc sống, học hỏi trái tim của bạn và điều chỉnh khi bạn đi.

cấp độ 2

cấp độ 1

Nếu bạn muốn học C thì chỉ cần làm điều đó.

Tôi không có nghĩa là khắc nghiệt. Một điều tôi đã học được trong suốt cuộc đời là tôi đã lãng phí quá nhiều thời gian để tự hỏi về mọi thứ thay vì làm mọi việc. Sống cuộc sống, học hỏi trái tim của bạn và điều chỉnh khi bạn đi.

cấp độ 2

Đó là lời khuyên tuyệt vời. Chỉ cần thử nó và xem nếu nó giúp tôi đoán. Tôi sẽ xem nếu làm cả hai giúp. Hiện tại tôi đã giữ CS50.

Nếu bạn thực sự muốn lặn sâu trong lập trình cấp thấp, hãy bắt đầu với ngôn ngữ lắp ráp.

cấp độ 1

Nếu bạn muốn học C thì chỉ cần làm điều đó.

Tôi không có nghĩa là khắc nghiệt. Một điều tôi đã học được trong suốt cuộc đời là tôi đã lãng phí quá nhiều thời gian để tự hỏi về mọi thứ thay vì làm mọi việc. Sống cuộc sống, học hỏi trái tim của bạn và điều chỉnh khi bạn đi.

cấp độ 2

Cũng có một vấn đề tâm lý về việc bạn có nên tập trung vào chỉ một điều tại một thời điểm. Tôi, cá nhân, thấy nó dễ dàng hơn nhiều để thực sự tập trung vào một điều mới tại một thời điểm. Điều đó có thể không giống với bạn, nhưng đối với tôi.

Cuối cùng, vì bạn nói rằng bạn yêu C, tại sao không học thêm một số và tự mình tìm hiểu xem nó có hiệu quả với bạn không?

cấp độ 1

Bạn dường như có một số hiểu lầm lớn về cách các ngôn ngữ hoạt động và mục đích của khoa học máy tính.

Tất cả những ngôn ngữ mà chúng ta nói đến là các ngôn ngữ mục đích chung [C, C ++, Java, Python,]

Điều đó trái ngược với Let Lôi nói Ladder chỉ thực sự được sử dụng trên PLC.

Ngôn ngữ đầu tiên của tôi là C và cá nhân tôi yêu ngôn ngữ. Nhưng nó thành thật mà nói không quan trọng ngôn ngữ bạn bắt đầu.

Mục đích của khoa học máy tính là nhiều hơn để dạy một người cách suy nghĩ về mặt thuật toán hơn là mã.

Hãy tưởng tượng một nhà toán học, họ phải học toán [cách đếm, cách thực hiện các hoạt động cơ bản, cách thực hiện tính toán, v.v.]. Trong ngôn ngữ tiếng Anh, chúng tôi đếm một, hai, ba, bốn trong tiếng Tây Ban Nha, bạn sẽ đếm uno, dos, tres, cuatro, nếu một nhà toán học đi từ Mỹ đến Tây Ban Nha, họ chỉ cần học cách đếm bằng tiếng Tây Ban Nha nhưng tất cả Logic toán học sẽ giữ nguyên.

Vì vậy, bạn tập trung ngay bây giờ thực sự không nên tập trung vào ngôn ngữ mà bạn mã hóa, nhưng về việc học các nguyên tắc cơ bản lập trình.

Thời gian trôi qua, bạn sẽ sớm thấy mình biết một số ngôn ngữ khác nhau. Một khi bạn có một nền tảng vững chắc, bạn thấy rằng việc học một ngôn ngữ mới chủ yếu là vấn đề của cú pháp mà bạn có thể học trong một tuần.

cấp độ 2

Tôi hiểu thuật toán POV nhưng có một lý do tại sao C được gọi là cấp thấp hơn Python, vì vậy nó không giống nhau. Trước đây đang giải thích cho bạn cách mọi thứ hoạt động dưới mui xe.

Bây giờ nếu bạn đã nói rằng điều đó không quan trọng theo thứ tự khi bạn học C. mà tôi có thể hiểu.

cấp độ 1

Bạn dường như có một số hiểu lầm lớn về cách các ngôn ngữ hoạt động và mục đích của khoa học máy tính.

cấp độ 2

Tôi hiểu thuật toán POV nhưng có một lý do tại sao C được gọi là cấp thấp hơn Python, vì vậy nó không giống nhau. Trước đây đang giải thích cho bạn cách mọi thứ hoạt động dưới mui xe.

cấp độ 1

Bạn dường như có một số hiểu lầm lớn về cách các ngôn ngữ hoạt động và mục đích của khoa học máy tính.

Tất cả những ngôn ngữ mà chúng ta nói đến là các ngôn ngữ mục đích chung [C, C ++, Java, Python,]

Điều đó trái ngược với Let Lôi nói Ladder chỉ thực sự được sử dụng trên PLC.

cấp độ 1

Ngôn ngữ đầu tiên của tôi là C và cá nhân tôi yêu ngôn ngữ. Nhưng nó thành thật mà nói không quan trọng ngôn ngữ bạn bắt đầu.

Mục đích của khoa học máy tính là nhiều hơn để dạy một người cách suy nghĩ về mặt thuật toán hơn là mã.

cấp độ 2

Tôi hiểu thuật toán POV nhưng có một lý do tại sao C được gọi là cấp thấp hơn Python, vì vậy nó không giống nhau. Trước đây đang giải thích cho bạn cách mọi thứ hoạt động dưới mui xe.

cấp độ 1

Bây giờ nếu bạn đã nói rằng điều đó không quan trọng theo thứ tự khi bạn học C. mà tôi có thể hiểu.

Python không thể tin được với các lập trình viên C [có thể là ngược lại], nhưng các khái niệm cơ bản của lập trình không gắn liền với bất kỳ ngôn ngữ nào. Bạn chắc chắn có thể quỳ xuống và học nhiều ngôn ngữ cùng một lúc. Trong khi tôi đi qua Basic-> Fortran-> C trở lại trong ngày, tôi đã phải học nhiều ngôn ngữ khác. Nhiều như tôi mặc dù Python, tôi đã phải sử dụng nó để làm việc trên các tiện ích hiện có được viết trong đó [và trong một vài trường hợp để mã hóa một số addin cho các gói như một số sản phẩm ESRI khăng khăng về điều đó thay vì bất kỳ API lành mạnh nào].

cấp độ 1

Người đàn ông thiếu đánh máy thực sự đã đụ tôi khi tôi mới bắt đầu học Python. "Ý bạn là cái quái gì tôi có thể lưu trữ một int và một chuỗi trong cùng một biến ??"

Lớp học đầu tiên của tôi về lập trình là ở C, Giáo sư của tôi là người làm việc trong IBM phát triển những thứ như GPF của họ. Anh ta đá cái chết tiệt ra khỏi chúng tôi [nói một cách ẩn dụ]. Như đã nói, bạn thực sự không muốn đối phó với C khi bạn đang làm việc chỉ học những điều cơ bản của điện toán. Cá nhân tôi rất khó để thích nghi, tôi đã dành nhiều thời gian cho lớp học đó hơn bất cứ điều gì khác. Tôi đã ra ngoài với một A, nhưng tôi thề nếu tôi đã có Python sau đó để tìm hiểu những điều cơ bản, tôi đã sẵn sàng sử dụng điều đó.

Các mảng là một chuyện, sau đó bạn đi vào con trỏ, số học con trỏ, quản lý bộ nhớ ngăn xếp/heap, mô tả tệp [về cơ bản mọi thứ trong Unix là FD], macro, v.v.

C cũng không phải là "cấp thấp", để đạt mức thấp nhất trước khi viết mã máy, bắt đầu viết ASM, sử dụng NASM hoặc trình biên dịch ASM khác.

MOV DWORD PTR [RBP-4], 1

Ví dụ, đó là gán 1 cho một biến bằng cách sử dụng tập lệnh x_86.

Kiểm tra //godbolt.org/

cấp độ 1

Nếu bạn muốn học C thì chỉ cần làm điều đó.

Tôi không có nghĩa là khắc nghiệt. Một điều tôi đã học được trong suốt cuộc đời là tôi đã lãng phí quá nhiều thời gian để tự hỏi về mọi thứ thay vì làm mọi việc. Sống cuộc sống, học hỏi trái tim của bạn và điều chỉnh khi bạn đi.

cấp độ 2

Đó là lời khuyên tuyệt vời. Chỉ cần thử nó và xem nếu nó giúp tôi đoán. Tôi sẽ xem nếu làm cả hai giúp. Hiện tại tôi đã giữ CS50.

cấp độ 1

Nếu bạn muốn học C thì chỉ cần làm điều đó.

cấp độ 1

Nếu bạn muốn học C thì chỉ cần làm điều đó.

dict_one = {1: 1, 2:2, 3:3}
dict_two = dict_one
dict_two[4] = 4
print[dict_one[4]]

Tôi không có nghĩa là khắc nghiệt. Một điều tôi đã học được trong suốt cuộc đời là tôi đã lãng phí quá nhiều thời gian để tự hỏi về mọi thứ thay vì làm mọi việc. Sống cuộc sống, học hỏi trái tim của bạn và điều chỉnh khi bạn đi.

str_one = "this is a string."
str_two = str_one
str_one = str_one[:5]
print[str_one]
print[str_two]

cấp độ 2

cấp độ 1

Nếu bạn muốn học C thì chỉ cần làm điều đó.

cấp độ 1

Nếu bạn muốn học C thì chỉ cần làm điều đó.

Bài Viết Liên Quan

Chủ Đề