Preferendo Python su C per la programmazione algoritmica

16

Ho studiato un po 'di algoritmi e ho guardato siti come SPOJ.pl TopCoder, ecc. Ho visto che i programmatori preferiscono C o C ++ di solito per la maggior parte dei concorsi di programmazione algoritmica.

Ultimamente ho avuto qualche problema ultimamente. Conosco sia un po 'di C che Python e quando provo a scrivere un codice mi sembra preferire Python su C per la maggior parte degli algoritmi. Ogni volta che mi siedo per scrivere un codice in C, mi arrendo dopo circa 15 minuti perché lo trovo troppo macchinoso e tende a spostarmi su Python. Passare le matrici I puntatori e così via sembrano essere inutili perdite di tempo che potrei effettivamente utilizzare per pensare all'algoritmo stesso.

Ora so e ho sentito da molte persone che C è una lingua molto importante ed è il pane e il burro di molti programmatori là fuori.

Quello che volevo sapere era se questo mio approccio avesse qualche svantaggio / conseguenze / svantaggi ecc.

Questo non è un dibattito tra Python e C; Questa è una domanda su come questa pratica specifica di preferire Python su C a causa della facilità d'uso avrà effetti su di me o su qualsiasi altro programmatore / scienziato informatico a lungo termine.

Mi piacerebbe ricevere notizie da persone che hanno utilizzato queste lingue nel settore / eo sviluppare software / librerie di grandi dimensioni, ecc.

    
posta ffledgling 08.08.2012 - 21:07
fonte

10 risposte

14

Nella mia esperienza, quando le persone hanno degli algoritmi di codifica in eccesso in C, è spesso perché accoppiano strettamente la gestione della struttura dei dati con il loro algoritmo invece di creare astrazioni appropriate. Ad esempio, manipolando manualmente i puntatori di elenchi collegati, invece di creare push() e pop() funzioni. Sono troppo abituati ad avere quelle astrazioni a loro fornite.

Sebbene questo problema sia molto più evidente con le astrazioni di livello inferiore, il mancato riconoscimento dell'accoppiamento stretto e la creazione di astrazioni appropriate è un problema a tutti i livelli. Esercitandoti con queste abilità in C fino a quando non riesci a creare un algoritmo che sembra pulito e leggibile, passerai a qualsiasi lingua tu usi.

L'altro problema che vedo occasionalmente tra i programmatori python è la difficoltà nell'adattarsi per le prestazioni su larga scala. Certo, le prestazioni non sono di solito la preoccupazione principale, ma il modo più plateale di implementare un algoritmo per una struttura di dati relativamente piccola può rallentare il tuo sistema quando lavori con gigabyte o più dati. Diventare un buon programmatore C ti aiuta a essere più consapevole di questi tipi di problemi in qualsiasi lingua.

Puoi imparare quelle abilità in altre lingue? Certo, ma C aiuta a renderlo molto più evidente quando ti sbagli.

Detto questo, uso python per la programmazione algoritmica quando ho una scelta, anche se mi sento a mio agio in C. Python ha caratteristiche linguistiche che lo rendono molto utile per quel tipo di programmazione, e le differenze di prestazioni sono di solito trascurabile. Non posso parlare del motivo per cui altri programmatori che conoscono entrambi sceglierebbero C. Immagino che molti di loro lo facciano semplicemente per distinguersi dalla massa.

    
risposta data 08.08.2012 - 22:24
fonte
10

I ricercatori il cui interesse principale non è la programmazione preferiscono linguaggi di livello superiore come Python, perché possono codificare una soluzione più facilmente in tali linguaggi rispetto, ad esempio, C. Python è particolarmente adatto a questo perché è più orientato verso la "prototipazione" , è "batterie incluse" e si integra con librerie numeriche come NumPy e SciPy.

Se un ricercatore ha bisogno di prestazioni migliori, di solito trasferisce l'algoritmo che ha creato in Python a un ingegnere del software, che troverà dei modi per ottimizzarlo (fino a includere la ricodifica in C).

    
risposta data 08.08.2012 - 21:13
fonte
10

Ricorda SPOJ.pl, la competizione ACM e tutte le competizioni simili sono focalizzate sulla produzione di codice di lavoro veloce che verrà gettato via subito dopo la competizione. TopCoder fa questo, ma in misura minore (il codice è almeno correttamente organizzato a livello di progettazione OO).

Tuttavia, nel mondo reale della programmazione quasi tutte le scorciatoie che si prendono nelle competizioni di programmazione algoritmica sono un anti-modello. Solo se tieni questo in mente, puoi fare qualsiasi tipo di paragone. Prendiamo il tuo esempio: passando un array multidimensionale tra diverse funzioni. In un ambiente di concorrenza, l'approccio migliore sarebbe semplicemente dichiarare l'array globale per risparmiare tempo a capire i dettagli della chiamata corretta (ad esempio, se dovessi superare la dimensione o essere determinata?). Nella programmazione reale, farei l'esatto opposto.

Quindi, alla tua domanda, ci sono conseguenze complesse di scegliere Python su C per gli algoritmi, direi di no. Se ti interessa solo l'algoritmo, farai la stessa cosa in Python e C. L'implementazione in un linguaggio funzionale potrebbe portare ad alcune differenze, ma l'algoritmo è sempre lo stesso.

Virtualmente l'unica cosa che hai acquisito implementando l'algoritmo in C è più controllo sull'esecuzione e una garanzia che stai usando solo astrazioni di livello inferiore. Questa non è una cosa da poco, dato che in Python gran parte della complessità è nascosta. Ma se il problema non è banale nelle astrazioni di livello superiore, hai perso solo la velocità di esecuzione e, nella maggior parte dei casi, non stai davvero cercando di rendere il programma il più veloce possibile, stai semplicemente imparando .

Come già suggerito, puoi sempre scambiare un'implementazione Python con un'implementazione C se Python risulta troppo lento. Ma questo succederà probabilmente 2-3 volte in un grande progetto, quindi iniziare in C potrebbe essere una perdita di tempo, a meno che non sia la tua lingua preferita (e hai indicato che non lo è).

    
risposta data 08.08.2012 - 21:39
fonte
9

Come membro di lunga data di TopCoder e utente occasionale di SPOJ posso dirti che la ragione principale per preferire C / C ++ rispetto ad altre lingue nelle competizioni è la sua velocità non elaborata. Quando viene programmata l'esecuzione del programma, vi è un'enorme pressione per scegliere la lingua "più veloce" che è possibile ottenere, perché offre un maggiore margine in termini di codifica del proprio algoritmo. La mia progressione in TC è passata da Java a C # a C ++.

Tuttavia, questa situazione è più comune nelle competizioni rispetto allo sviluppo quotidiano: sebbene scrivere codice ottimale sia universalmente importante, l'importanza relativa di terminare il proprio codice il prima possibile e renderlo il più possibile manutenibile solitamente supera risparmiando alcune centinaia di cicli della CPU. Se sei più a tuo agio nel programmare qualcosa in Python, è molto spesso una soluzione preferita.

Inoltre, Python offre funzionalità di alto livello che non sono disponibili in C ++. Costruirli è spesso molto costoso, e talvolta persino impossibile (per esempio, si consideri la costruzione di una riflessione o di un codice auto-modificante in C ++). In casi come quelli che si basano su un linguaggio di livello superiore potrebbe rivelarsi una soluzione ottimale.

    
risposta data 08.08.2012 - 21:45
fonte
5

Everytime I sit down to write a code in C I give up after about 15 minutes because I find it too cumbersome and tend to move over to python.

Questo aumento di produttività è la ragione comune per cui i lavori in C e C ++ sono diminuiti sostanzialmente.

This a question about how this specific practice of preferring python over C because of the ease of use will affect me or any other programmer/computer Scientist in the long run.

Ci sono due parti fondamentali in questo. Il primo è la programmazione algortihmica. Non importa quale linguaggio usi per esprimere l'algoritmo. Lavorare con l'algoritmo stesso e inserire quelli giusti nei problemi giusti sono le parti chiave, quindi non c'è alcun problema reale lì.

La seconda parte è guadagni di produttività. Usare le cose che ti rendono più produttivo nel tempo è una buona abitudine e qualcosa che non farà altro che avvantaggiarti durante la tua carriera. Essere in grado di esprimere gli algoritmi in diverse lingue è molto utile, ma questa disponibilità si concentra su ciò che le lingue usano non necessariamente quelle lingue.

In breve, non preoccuparti di questo . Quello che usi per esprimere l'algoritmo è molto meno importante di essere in grado di esprimerlo del tutto.

    
risposta data 08.08.2012 - 21:25
fonte
3

I vantaggi dell'uso di linguaggi di livello superiore come Python o Ruby sono che (1) la loro sintassi è molto vicina allo pseudocodice e (2) le loro librerie standard forniscono strutture di dati utili fuori dalla scatola (le batterie includevano il concetto che @Robert menzionava ). Quindi è perfettamente bene preferire usarli. Utilizza qualsiasi cosa massimizzi la tua produttività, invece di scegliere una lingua solo perché è mainstream o "cool".

    
risposta data 08.08.2012 - 21:58
fonte
2

Cosa ti mancherà quando programmerai in linguaggi "superiori" di quanto C / C ++ stia imparando come funzionano i computer. Non sarai in grado di sviluppare cose come sistemi embedded, sistemi operativi e driver hardware. Conoscere C aiuta anche ad imparare l'assemblatore.

Inoltre, la stragrande maggioranza di tutti i sistemi mission critical sono ancora sviluppati in C, quindi potresti non essere in grado di lavorare in diverse branche di software software (aerospaziale / automobilistico / med-tech ecc.) senza saperlo.

    
risposta data 10.08.2012 - 08:20
fonte
1

Se una domanda continua sulla "notazione Big O" e provi a misurarla, allora può essere più difficile da fare in Python a meno che tu non sappia molto di più su come Python implementa le cose, per esempio una lista Python non è una lista collegata; Pythons sort è TimSort; Garbage collection Python in determinati momenti ...

Trovo sempre più facile collegare un programma C a ciò che è probabile che accada su un processore, ma anche qui, c'è il caching del processore; time-slicing del sistema operativo; Ottimizzazioni del compilatore ecc. Che possono influenzare il mio intuito.

Trovo più veloce scrivere e eseguire il debug del codice Python in modo che, quando viene data una scelta, scrivo prima in Python concentrandomi sull'ottenere qualcosa che funzionasse. Con questo programma Python funzionante puoi spesso inserirlo in un sistema più grande e scoprire non solo che ha funzionato, ma anche se è stato abbastanza veloce o in quale aspetto è stato lento. Ottenere dati reali sulle prestazioni aiuta quando ottimizzi la velocità e ti permette di testare la versione di Python contro qualsiasi riscrittura successiva in Python o C o altro.

Quindi gli svantaggi nell'usare solo Python è che può essere difficile cogliere i vantaggi degli algoritmi che sono stati scritti in attesa di una compilazione simile a C al modello di processore. Gli svantaggi di usare solo C sono come hai detto: è un maiale da scrivere e fare il debug e si finisce per dover scrivere le proprie librerie troppo spesso.

Penso che sarebbe meglio usarli entrambi (e altre lingue), finché non avrai un'idea dei loro compromessi. Io stesso ero un buon programmatore di C, ma ora scrivo pochissimo codice C originale, anche se devo ancora leggere (e talvolta debuggare) il codice C nel mio lavoro. Anche se preferisco Python, conosco e utilizzo ancora Perl e Awk (e sed e grep e sort, Tcl e C e ...).

    
risposta data 08.08.2012 - 23:26
fonte
1

Ti consiglio di guardare Scala o Clojure (ma usa annotazioni di tipo). In alcuni casi possono essere veloci come C, in altri casi sono ancora molto più veloci di Ruby / Python, pur avendo molto consice e notazione chiara a differenza di C (< em> IMHO ). Considera questo contro il codice C:

for (i <- 1 to 100; j <- 2 until 100;
     k <- 1 to 2; if i != j) {
     //...
}

Hanno anche un arsenale di programmazione delle funzioni simile a% di Coyde%, map , filter ecc di Ruby che non è veloce quanto la ricorsione iterativa o coda, tuttavia è ancora molto più veloce dei linguaggi di scripting completamente dinamici .

    
risposta data 10.08.2012 - 09:01
fonte
1

I'd love to hear from people who've used these languages in the industry/and or to develop large software/libraries etc.

Ho lavorato su una piccola parte di una grande libreria C ++ per alcuni anni, e ho scritto sia la mia laurea che la mia tesi di laurea nel contesto di questa biblioteca. La biblioteca, per inciso, è una libreria per algoritmi di bioinformatica e strutture dati.

La libreria è costruita in C ++ perché C ++ è quasi perfetta per i requisiti specifici di questa libreria e per le librerie di algoritmi in generale. Se dovessi sviluppare un'altra libreria di algoritmi e la scelta del linguaggio fosse mia, sceglierei di sicuro C ++.

Il motivo è non solo prestazioni, ma anche il sistema di tipo strong che ti dà innanzitutto più sicurezza di tipo e in secondo luogo ti dà la possibilità di lasciare che i tuoi tipi documentino l'algoritmo utilizzato. Ciò può (nella mia esperienza) migliorare notevolmente la leggibilità e la manutenibilità.

Detto questo, per i doodles e gli enigmi algoritmici semplici, uso quasi sempre Python (principalmente perché sì, si legge quasi come pseudo codice), a meno che non voglia specificamente provare come formulare meglio un problema in C ++. Finora, non ho risolto molti dei problemi di SPOJ o TopCoder, quindi non so se le prestazioni siano davvero così importanti che l'uso di un linguaggio veloce sia fondamentale.

Ma normalmente ciò che conta è ottenere l'algoritmo giusto per passare. In questi casi, Python funziona perfettamente. Ad esempio, per i problemi di Project Euler (che non sono sincronizzati, conta solo la soluzione corretta), Python è perfettamente adatto.

    
risposta data 10.08.2012 - 12:22
fonte